2015-07-06 20 views
9

Tôi đã tự hỏi liệu có thể vượt qua một hàm foo() làm thuộc tính func="foo()" và có nó được gọi là this.func() bên trong phần tử polymer không?Truyền chức năng dưới dạng giá trị thuộc tính

<foo-bar func="foo()"></foo-bar> 


Polymer({ 
    is: 'foo-bar', 
    properties: { 
    func: Object, 
    }, 
    ready: function() { 
    this.func(); 
    } 
}); 

Tôi đã cố gắng để làm việc này cho các lứa tuổi không có may mắn.

Xin cảm ơn trước.

+0

Vì vậy, phần tử gốc của bạn xác định hàm 'foo' và phần tử con của bạn (' foo-bar') đang cố gắng gọi nó? –

+0

@BenThomas nó chỉ chuyển một hàm dưới dạng giá trị thuộc tính. Chúng tôi sẽ giả định đơn giản rằng xuất hiện như vậy trong tài liệu HTML. Không có phần tử cha trong trường hợp này. –

+0

Có [câu trả lời khác cho câu hỏi này tại đây] (https://stackoverflow.com/q/31441401/1640892). ... https://stackoverflow.com/q/31441401/1640892 – Mowzer

Trả lời

2
<foo-bar func="foo()"></foo-bar> 



Polymer({ 
    is: 'foo-bar', 
    properties: { 
    func: { 
     type: String, // the function call is passed in as a string 
     notify: true 
    }, 
    attached: function() { 
    if (this.func) { 
     this.callFunc = new Function('return '+ this.func); 
     this.callFunc(); // can now be called here or elsewhere in the Polymer object 
    } 
}); 

Vì vậy, mẹo là "foo()" là chuỗi khi bạn chuyển nó lần đầu tiên cho phần tử Polymer. Tôi đã chiến đấu với điều này trong một thời gian là tốt và đây là cách duy nhất tôi có thể tìm thấy để làm cho nó được thực hiện. Giải pháp này tạo ra một hàm trả về cuộc gọi hàm của bạn, mà bạn gán làm giá trị của một trong các thuộc tính phần tử polymer của bạn.

Một số người có thể nói bạn không nên sử dụng hàm tạo bởi vì nó giống với eval() và .... bạn biết đấy, toàn bộ 'eval là điều ác'. Nhưng nếu bạn chỉ sử dụng nó để trả lời một cuộc gọi đến một chức năng khác và bạn hiểu được những hàm ý phạm vi thì tôi nghĩ đây có thể là một trường hợp sử dụng thích hợp. Nếu tôi sai, tôi chắc chắn ai đó sẽ cho chúng tôi biết!

Dưới đây là một liên kết đến một đẹp SO trả lời về sự khác biệt giữa eval() và các nhà xây dựng chức năng trong trường hợp nó có thể giúp: https://stackoverflow.com/a/4599946/2629361

Cuối cùng, tôi đặt này trong trường hợp vòng đời 'gắn' để được vào an toàn vì nó xảy ra muộn hơn 'sẵn sàng'. Tôi không chắc chắn nếu một sự kiện vòng đời trước đó hoặc 'sẵn sàng' có thể được sử dụng thay vì 'đính kèm'. Có lẽ ai đó có thể cải thiện câu trả lời này và cho chúng tôi biết.

+1

Hàm dựng hàm vẫn hoạt động rất giống với eval() nhưng không bao giờ-ít-tôi chắc chắn rằng đề xuất của bạn là cách duy nhất để chuyển một hàm như một thuộc tính. Tôi có lẽ sẽ từ bỏ ý tưởng này vì những hạn chế mặc định CSP và những gì không. –

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