Javascript 使用主干木偶时控制器中未接收事件

Javascript 使用主干木偶时控制器中未接收事件,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,我有一个页面上显示的赠款集合。当我输入一个框时,它会过滤列表。 文本输入在木偶项视图上触发一个事件,该事件使用已过滤的向下集合调用控制器: keywordFilter: function (ev) { var keyword = ev.currentTarget.value; var controller = sff.app.router.controller; var collection = sff.app.grantList; var filtered =

我有一个页面上显示的赠款集合。当我输入一个框时,它会过滤列表。 文本输入在木偶项视图上触发一个事件,该事件使用已过滤的向下集合调用控制器:

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意大利面也不要这种胡说八道。

如果你不能得到它的引用。你可以在其他对象上触发事件,例如主干网,然后在控制器中听它

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...

}

嗯,您正在ItemView上触发一个事件,并在控制器上侦听一个事件。这确实不起作用。我想您在控制器中的某个位置有一个对视图的引用,请将其用作事件侦听器的目标。还可以尝试在事件绑定上使用
而不是
e控制器您可以执行类似以下操作:
this.listenTo(viewReference,'grants:filter',function());
问题是,控制器与不同的视图关联,因此我没有对它的引用。在这种情况下,我建议使用
wreqr
来引发和接收事件。请参阅: