2014-05-10 55 views
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意大利麪條比這個胡說。

+1

好了,你在你的ItemView控件觸發事件,聽您的控制器上的事件。這確實無效。我想你在控制器的某處引用了你的視圖,將它用作事件監聽器的目標。另外嘗試使用'listenTo'而不是'on'事件綁定。在你的控制器的例子中,你可以做一些像'this.listenTo(viewReference,'grants:filter',function()});' –

+0

問題是,控制器與不同的視圖相關聯,所以我沒有參考到它。 – eggbert

+0

在這種情況下,我會建議使用'wreqr'來引發和接收事件。請參閱:https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.application.md#messaging-systems –

回答

0

如果你不能得到它的引用,你可以在其他對象,例如骨幹觸發事件,並聽取它控制器。

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

}

相關問題