2015-01-15 14 views
5

Trong Meteor, tôi gửi hai đối tượng từ db của tôi đến một mẫu:Truy cập từ điển mẫu helper trong xử lý sự kiện Meteor

Template.myTemplate.helpers({ 
    helper1: function() { 
    var object1 = this; // data context set in iron:router...path is context dependent 
    // modify some values in object1 
    return this; 
    }, 
    helper2: function() { 
    return Collection2.find({_id: this.object2_id}); 
    } 
}); 

Bản mẫu này cũng có trình xử lý sự kiện để sửa đổi hai đối tượng trên. Tôi đang cố gắng để truy cập helper1 và helper2 từ trên, nhưng nếu tôi gọi bối cảnh dữ liệu của mẫu, tôi chỉ nhận được quyền truy cập vào phiên bản chưa sửa đổi của object1. Tôi làm cách nào để truy cập những người trợ giúp được xác định ở trên?

Template.myTemplate.events({ 
    'submit form': function(event) { 
    event.preventDefault(); 
    // Access helper2 object and attributes here instead of calling Collection2.find() again 
    } 
}); 
+2

không có cách nào để gọi người giúp đỡ với các API công cộng hiện nay. –

+1

Peppe, bạn có thể biết điều này, nhưng tôi chỉ phát hiện ra có một api nội bộ để truy cập người trợ giúp - Template.myTemplate .__ helpers.get ('helper'); – bgmaster

+0

Vì đây là nội bộ, tôi cho rằng api có thể thay đổi trong tương lai, do đó, có thể không phải là ý tưởng hay nhất để sử dụng mã này thường xuyên trong mã của bạn. – bgmaster

Trả lời

4

Helpers chỉ là chức năng và do đó có thể được thông qua xung quanh và gán cho các biến khác theo ý muốn, do đó bạn có thể định nghĩa một hàm và sau đó gán nó chìa khóa helper2 của mẫu người giúp đỡ và gọi bởi đó là tài liệu tham khảo ban đầu từ xử lý sự kiện.

var helperFunction = function() { 
    return Collection2.find({_id: this.object2_id}); 
}; 

Template.myTemplate.helpers({ 
    helper1: function() { 
     var object1 = this; // data context set in iron:router...path is context dependent 
     // modify some values in object1 
     return this; 
    }, 
    helper2: helperFunction 
}); 

Template.myTemplate.events({ 
    'submit form': function(event) { 
     event.preventDefault(); 
     var cursor = helperFunction(); 
    } 
}); 
+0

Cảm ơn. Mô hình này giúp một chút với việc tránh lặp lại mã, mà tôi đang định làm. Điều duy nhất tôi sẽ lưu ý là chức năng này có thể thay đổi. Khi bạn gọi hàm trong trình xử lý sự kiện, điều này sẽ trở thành đối tượng Window thay vì ngữ cảnh dữ liệu. Tôi thấy điều này kỳ lạ xem xét điều này trong xử lý sự kiện vẫn là bối cảnh dữ liệu. Nếu bạn có thể cập nhật câu trả lời của mình để phản ánh điều này, tôi sẽ đánh dấu câu trả lời là chính xác. – bgmaster

+0

Như @bgmaster đã lưu ý, bạn cần gọi [phương thức gọi] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call) và cung cấp 'thisArg 'thay vì chỉ đơn giản gọi hàm. Tuy nhiên, trong trường hợp này, bạn không biết 'thisArg' nên là gì (và nó có thể khác thời gian' {{helper2}} 'đã được sử dụng, do đó, điều này không hoạt động nói chung). –

0

Nếu bạn có thể sửa đổi người trợ giúp khỏi sự kiện, thì bất kỳ phần nào của ứng dụng Meteor đều có thể làm, chống lại triết lý thiết kế của Blaze!

Blaze được thiết kế để trở thành hệ thống hấp dẫn ràng buộc dữ liệu hướng một chiều. Những gì bạn yêu cầu có thể đạt được bằng cách sử dụng Angular (được sử dụng riêng của nó, hoặc cạnh nhau với Blaze, xem THIS), đó là bản chất là một hệ thống hấp dẫn dữ liệu ràng buộc 2 chiều.

Bạn cũng có thể muốn kiểm tra phản ứng, đó cũng là một cách 2 dữ liệu ràng buộc

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