2008-09-17 14 views
7

Ví dụ: tôi muốn có thể lập trình nhấn một dòng mã như sau, trong đó tên hàm được gán động mà không sử dụng Đánh giá(). Mã dưới đây tất nhiên không hoạt động nhưng đại diện cho những gì tôi muốn làm.Làm thế nào để gọi một hàm động mà là một phần của một cfc được khởi tạo, mà không sử dụng Đánh giá()?

application.obj[funcName](argumentCollection=params) 

Cách duy nhất tôi có thể tìm thấy để gọi một chức năng tự động là sử dụng cfinvoke, nhưng như xa như tôi có thể nói rằng instantiates CFC liên quan/chức năng một cách nhanh chóng và không thể sử dụng CFC instantiated trước đó.

Cảm ơn

+1

Chỉ cần hoàn thành bức ảnh, Railo 3.3 thực sự hỗ trợ cú pháp bạn muốn. Và tôi thích nó. – Sergii

+1

Bạn có thể bỏ phiếu cho Adobe để hỗ trợ cú pháp này trong CF tại đây: [Bug 82579] (http://cfbugs.adobe.com/cfbugreport/flexbugui/cfbugtracker/main.html?#bugId=82579) –

Trả lời

9

Theo các tài liệu, bạn có thể làm một cái gì đó như thế này:

<!--- Create the component instance. ---> 
<cfobject component="tellTime2" name="tellTimeObj"> 
<!--- Invoke the methods. ---> 
<cfinvoke component="#tellTimeObj#" method="getLocalTime" returnvariable="localTime"> 
<cfinvoke component="#tellTimeObj#" method="getUTCTime" returnvariable="UTCTime"> 

Bạn sẽ có thể chỉ đơn giản gọi nó với method = "# myMethod #" để tự động gọi một chức năng cụ thể .

+0

Tôi đã thử các kết hợp khác nhau cho cfinvoke nhưng bằng cách nào đó đã bỏ qua điều này. Cảm ơn –

+0

Đây là phương pháp nhanh nhất. –

+0

:) đẹp. Tôi không biết bạn có thể làm điều này, nhưng đó là cách tiện dụng. – jinglesthula

4

Bạn có thể sử dụng cfinvoke. Bạn không phải chỉ định một thành phần.

<cfinvoke method="application.#funcName#" argumentCollection="#params#"> 
1

Bạn cũng có thể làm điều gì đó rất giống với cách bạn muốn sử dụng. Bạn có thể truy cập phương thức trong đối tượng bằng cú pháp bạn đã sử dụng, bạn không thể gọi nó cùng một lúc. Tuy nhiên, nếu bạn gán cho biến tạm thời, bạn có thể gọi nó là một biến tạm thời, sau đó bạn có thể gọi nó là

<!--- get the component (has methods 'sayHi' and a method 'sayHello') ---> 
<cfset myObj = createObject("component", "test_object")> 

<!--- set the function that we want dynamically then call it (it's a two step process) ---> 
<cfset func = "sayHi"> 
<cfset funcInstance = myObj[func]> 
<cfoutput>#funcInstance("Dave")#</cfoutput> 

<cfset func = "sayHello"> 
<cfset funcInstance = myObj[func]> 
<cfoutput>#funcInstance("Dave")#</cfoutput> 
+0

Sao chép hàm từ myObj vào trang hoặc, một CFC khác có thể có tác động tiêu cực nếu hàm sử dụng biến phạm vi 'this' hoặc 'variables'. –

1

Trong CFML, hàm là thành viên hạng nhất của ngôn ngữ. Điều này cho phép chúng ta truyền chúng xung quanh như một biến. Trong ví dụ sau, tôi sẽ sao chép hàm có tên 'foobar' và đổi tên nó là "$ fn" trong cùng một đối tượng. Sau đó, chúng ta chỉ cần gọi $ fn().

funcName = 'foobar';  
application.obj.$fn = application.obj[funcName]; 
application.obj.$fn(argumentCollection=arguments); 

Ngữ cảnh của hàm rất quan trọng, đặc biệt nếu nó tham chiếu bất kỳ giá trị nào trong phạm vi 'biến' hoặc 'này' của đối tượng. Lưu ý: đây không phải là chủ đề an toàn cho các phiên bản CFC trong các phạm vi được chia sẻ!

Phương pháp nhanh nhất là sử dụng đề xuất của Ben Doom. Tôi chỉ muốn được triệt để.

+0

đó là một điểm tốt Aaron. Có, nếu bạn cần phải duy trì bối cảnh (mà bạn thường sẽ trong bất kỳ phong cách OO thực sự) sau đó sao chép các chức năng ra khỏi phạm vi của thành phần sẽ thất bại. –

+0

Khi cuộc trò chuyện chuyển sang twitter, @seancorfield đã chỉ ra rằng đây không phải là chuỗi lưu trên một singleton. Nếu nhiều chủ đề có thể gọi cùng một $ fn, thì tốt nhất bạn nên chọn tên ngẫu nhiên. BTW Phương pháp này có vẻ nhanh như eval ("application.obj. # FuncName # (argumentCollection = arguments)"); –

Các vấn đề liên quan