2012-09-13 31 views
16

我有許多骨幹模型,在集合中組織並連接到它們相應的視圖和/或視圖集合。其中一些不屬於同一集合的模型需要觸發另一個模型(也可能不止一個)感興趣的事件。backbone.js +全局事件調度器+ require.js:操作方法?

推薦的方式來處理這個問題,我認爲,如「here和其他地方描述的」全球事件調度員/聚合器「。

但是,我也恰好在使用require.js,這似乎違背了將調度器/聚合器附加到應用程序的命名空間對象的想法 - 或者我在這裏錯了嗎?

所以我的問題是:使用require.js我怎麼能有一些不同的骨幹模型觸發一個事件,將由另一個模型處理?

回答

35

類似的解決方案是什麼@Andreas p但沒有Backbone.Marionette(儘管如此,受到了很大的啓發,see the article linked in the question)。

您所要做的就是定義一個模塊,該模塊創建一個事件監聽器的單例,並在要觸發事件或監聽此事件的模塊中需要此對象。

比方說,你必須定義自己的頻道

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

然後,您可以通過

require(['app/channel'], function (channel) { 
    channel.on('app.event', function() { 
     console.log('app.event'); 
    }); 
}); 

使用它作爲一個聽衆並且可以觸發一個事件應用程序/ channel.js此通道通過

require(['app/channel'], function (channel) { 
    channel.trigger('app.event'); 
}); 
+0

我認爲這是我一直在尋找的。非常感謝nikoshr and andreas – alearg

+0

這種情況下事件使用的優勢是什麼?我們仍然必須在所有觸發該事件的模塊中包含「應用/模型」。爲什麼不在該模型上進行api調用? – wizardzloy

+1

@wizardzloy您必須包含的唯一模塊是您想要偵聽或觸發全局事件的「app/channel」。 'app/model'只是爲了演示一個示例用法。 – nikoshr

1

我們使用Marionettes app.vent(這是我們應用程序的全球事件發送器),allong需要js,它運行得非常好。

應用

define(, function(){ 
    return new Backbone.Marionette.Application(); 
}) 

型號1

define(['app'], function(app){ 
    return Backbone.Marionette.Model.extend({ 
    initialize: function(){ 
     this.bindTo('app.vent', 'create:model2', this.toSomething, this); 
    } 
    }) 
}) 

模型2

define(['app'], function(app){ 
    return Backbone.Marionette.Model.extend({ 
    initialize: function(){ 
     app.vent.trigger('create:model2', this); 
    } 
    }) 
}) 
+0

很高興知道,使用require.js的Marionette是可以的。然而,沒有解決不涉及額外/替代框架的問題嗎? – alearg

+0

有一堆解決方案。我可以建議PubSubJS:https://github.com/mroderick/PubSubJS –

+0

感謝您的建議,我會看看它。但是有沒有解決方案不涉及任何其他框架? – alearg