2015-04-29 16 views
5

Trong CF10, tôi muốn truy cập một đối tượng Test biến bằng cách sử dụng hàm onMissingMethod trong đối tượng TestHelper, nhưng tôi gặp lỗi.Sử dụng onMissingMethod không thể truy cập các biến đối tượng

Test.cfc

component { 

public Any function init(){ 
    instance = { x = 1 }; 
    return this; 
} 

public numeric function getX(){ 

    return instance.x; 

} 

} 

TestHelper.cfc

component { 

public Any function init(){ 
    variables.testObj = new Test(); 
    return this; 
} 

public any function onMissingMethod(required string missingMethodName, required struct missingMethodArguments){ 

    var func = variables.testObj[ arguments.missingMethodName ]; 
    return func(argumentCollection = arguments.missingMethodArguments); 

} 

} 

Gọi đối tượng

obj = new TestHelper(); 
writeOutput(obj.getX()); //Element INSTANCE.X is undefined in VARIABLES 

Trong CF10, điều này mang lại cho tôi một lỗi mà yếu tố X là undefined trong ví dụ. Nó dường như không nhận ra thể hiện biến. Tôi có thể xác định rõ ràng chức năng getX trong TestHelper, nhưng tôi đã hy vọng tôi có thể sử dụng chức năng onMissingMethod.

Tôi có hiểu lầm về cách onMissingMethod hoạt động ở đây không? FWIW, mã hoạt động ở Railo.

Trả lời

2

Nếu tôi hiểu vấn đề của bạn, tôi rất ngạc nhiên khi mã này chạy trên Railo. Tôi không nghĩ rằng nó nên.

Vấn đề là với mã này:

var func = variables.testObj[ arguments.missingMethodName ]; 
return func(argumentCollection = arguments.missingMethodArguments); 

Ở đây bạn đang kéo các chức năng getX() ra khỏi variables.testObj, và chạy nó trong bối cảnh TestHelper dụ của bạn. Và đối tượng đó không có `biến.x. Do đó lỗi.

Bạn cần đặt tài liệu tham chiếu func vào variables.testObj, không được kéo getX ra khỏi tài khoản. Vì vậy, như thế này:

var variables.testObj.func = variables.testObj[ arguments.missingMethodName ]; 
return variables.testObj.func(argumentCollection = arguments.missingMethodArguments); 

Bằng cách đó bạn đang chạy func() (proxy của bạn để getX()) trong bối cảnh đúng, vì vậy nó sẽ thấy variabales.x.

Với tình hình này, không có cách nào mã này nên làm việc trên Railo (dựa trên thông tin bạn đã cung cấp cho chúng tôi là tất cả thông tin có liên quan, dù sao đi nữa).

+0

Adam, bạn nói đúng (như thường lệ). Khi tôi thử nghiệm nó trong Railo, tôi đã thực sự làm 'return variables.testObj [arguments.missingMethodName] (argumentCollection = arguments.missingMethodArguments);'. Nhưng CF10 không thích mã này, vì vậy tôi nghĩ rằng tôi chỉ có thể gán phương thức cho một biến func và sau đó gọi nó trên dòng tiếp theo. Tôi đã không nhận ra rằng làm như vậy sẽ đưa phương pháp ra khỏi bối cảnh của nó. Cảm ơn bạn đã làm rõ. Nhiều đánh giá cao. – user2943775

+0

Không có probs. Vâng, chúng tôi đã cố gắng để Adobe thêm cú pháp đó, nhưng họ sẽ không. Có 'invoke()' mặc dù, có thể giúp gì? https://wikidocs.adobe.com/wiki/display/coldfusionen/Invoke –

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