使用Backbone Marionette时未在控制器中接收事件

时间:2014-05-10 13:33:28

标签: javascript backbone.js marionette

我在页面上显示了一系列赠款。当我输入一个框时,它会向下过滤列表。 文本输入在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意大利面而不是这个废话。

1 个答案:

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

}