我在页面上显示了一系列赠款。当我输入一个框时,它会向下过滤列表。 文本输入在marionette itemView上触发事件,该事件使用已过滤的向下集合调用控制器:
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)但它仍然没有工作。
如下所述,控制器没有引用itemView,反之亦然。我想也许我想做app.vent.trigger('grants:filter')但是如何从itemView获取对app的引用?
我开始非常讨厌骨干和牵线木偶,我实际上宁愿拥有jquery意大利面而不是这个废话。
答案 0 :(得分:0)
如果你无法获得它的参考。您可以在其他对象(例如Backbone)上触发事件,并在控制器中监听它。
keywordFilter: function (ev) {
var keyword = ev.currentTarget.value;
Backbone.trigger('grants:filter', keyword);
}
var GrantController = Marionette.Controller.extend({
initialize: function (options) {
Backbone.on("grants:filter", function(keyword) {
});
},
...more methods...
}