在Backbone.js视图之间传递消息

时间:2015-01-15 15:33:21

标签: javascript backbone.js views backbone-views backbone-events

我目前正在处理公司骨干应用程序中的一个错误,其中一个视图中正在进行的任务应禁用另一个视图中的行为。我们正在寻找的行为是当任务开始并且用户导航到第二个视图时,行为已被禁用,但由于尚未呈现视图,因此不会触发禁用该行为的事件。

如果没有参数化视图,有没有解决方法呢?

目前的代码如下:

在settings.js中:

handleUpdateClick: function(evt) {
    // ...
    EventDispatcher.trigger('updatingStateChanged');
    // ...
}

在dashboard.js中:

initialize: function(options) {
    EventDispatcher.on("updatingStateChanged", this.handleUpdatingStateChanged);
    // ...
}

3 个答案:

答案 0 :(得分:0)

通常,许多应用程序所做的是具有全局"应用程序状态" model,用于存储当前状态,可以在组件之间共享数据/事件。

答案 1 :(得分:0)

另一种选择是拥有一个全局应用程序控制器,可能基于Backbone.Router,它作为事件和消息传递的单例 - 在大型项目中经常看到这种情况。

答案 2 :(得分:0)

要添加到当前的答案,在我的一个Backbone应用程序中,我创建了一个中央Hub来监听事件。所以它就像这样

//This is outside your view code
var HUB = {};
_.extend(HUB, Backbone.Events);

在您的视图中,您可以在Hub上收听事件:

initialize: function(options) {
    HUB.on('state:change', this.handleUpdatingStateChanged, this);        
        // ...
}

然后在你的settings.js中你可以像这样触发对Hub的事件:

handleUpdateClick: function(evt) {
    // ...
    HUB.trigger('state:change');
    // ...
}

我认为这种方法可以解决您的问题。实现起来也很简单。一个重要的问题是,当您关闭视图时,必须记住停止侦听和取消扇区中的事件 - 通常您只需在现有的僵尸视图清理/关闭方法中添加HUB.off(null, null, this);