2014-01-27 23 views
2

我正在編寫一個使用RequireJS來定義模塊的Backbone應用程序。我已經達到了如何傳遞事件聚合器而不使用全局變量或將其作爲參數傳遞給每個View的古老問題。在RequireJS中集中骨幹事件聚合器 - 這是如何工作的?

vent = _.extend({}, Backbone.Events); 

我已經採取了approach used here的木偶,但因爲我沒有使用木偶(還),我已經適應它使用無聊的老vent對象:

vent.js

define(['underscore', 'backbone'], function (_, Backbone) { 
    return _.extend({}, Backbone.Events); 
}); 

所以現在我的各種模塊,我可以發佈和訂閱,如:

查詢列表-view.js

define(['backbone', 'vent'], function (Backbone, vent) { 

    var EnquiryListView = Backbone.View.extend({ 

     events: { 
      'click .enquiry-list-item-manage': 'manageClick' 
     }, 

     manageClick: function() { 
      vent.trigger('navigate', 'enquiry/' + id); 
     } 
    }); 
}); 

APP-router.js

define(['backbone', 'vent'], function (Backbone, vent) { 

    var AppRouter = Backbone.Router.extend({ 
     routes: { 
      'enquiry/:id': 'enquiryManage' 
     }, 

     initialize: function() { 
      //listen out for navigate events 
      this.listenTo(vent, 'navigate', this.gotoRoute); 
     }, 

     gotoRoute: function (route) { 
      this.navigate(route, { trigger: true }); 
     } 
    }); 

這種模式似乎工作沒關係,路由器可以聽vent對象和視圖可以觸發一個事件。

但是...路由器和視圖怎麼看着同一個對象?每次不同的模塊需要時,vent.js中的return _.extend({}, Backbone.Events);總是返回一個新對象?

有沒有關於RequireJS,我沒有得到,或者是_.extend做一些事情Backbone.Events,或者有可能是關於JavaScript的東西(其他),我不完全瞭解?

回答

5

在AMD中,定義回調只執行一個。其結果用於所有從屬模塊。結帳this後。我認爲你的問題與此有關。

+0

太棒了,謝謝你清理那個。在我眼前閃過一百萬個脫鉤想法。 RequiresJS是一件非常好的事情:) –