0
我有一個頁面上顯示的授權集合。當我輸入一個框時,它會將列表過濾掉。 文本輸入觸發一個木偶ItemView控件,它與過濾下來收集調用控制器的事件:使用Backbone Marionette時未收到控制器中的事件
keywordFilter: function (ev) {
var keyword = ev.currentTarget.value;
var controller = sff.app.router.controller;
var collection = sff.app.grantList;
var filtered = collection.filterByKeyword(keyword);
controller._showGrants(filtered, 1);
}
也能正常工作,但我的方式去控制和收集參考看起來並不太好,並據稱使用事件比較好,所以我嘗試這樣做:
在ItemView控件:
keywordFilter: function (ev) {
var keyword = ev.currentTarget.value;
this.trigger('grants:filter', keyword);
}
在控制器:
var GrantController = Marionette.Controller.extend({
initialize: function (options) {
this.viewClass = options.viewClass;
this.app = options.app;
this.collection = options.collection;
this.on("grants:filter", function(keyword) {
console.log(keyword);
var filtered = this.collection.filterByKeyword(keyword);
this._showGrants(filtered, 1);
});
},
...more methods...
}
不幸的是,它沒有收到事件。我也試過this.app.on()和this.viewClass.on()和this.on(「itemView:grants:filter),但它仍然不起作用。
如下所述,控制器沒有參考我想我可能想做app.vent.trigger('grants:filter'),但是如何從itemView中獲得對應用的引用?
我開始真的了討厭骨幹和木偶,我實際上寧願有jquery意大利麪條比這個胡說。
好了,你在你的ItemView控件觸發事件,聽您的控制器上的事件。這確實無效。我想你在控制器的某處引用了你的視圖,將它用作事件監聽器的目標。另外嘗試使用'listenTo'而不是'on'事件綁定。在你的控制器的例子中,你可以做一些像'this.listenTo(viewReference,'grants:filter',function()});' –
問題是,控制器與不同的視圖相關聯,所以我沒有參考到它。 – eggbert
在這種情況下,我會建議使用'wreqr'來引發和接收事件。請參閱:https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.application.md#messaging-systems –