在主干.js视图之间传递消息

Pass Messages Between Backbone.js Views

本文关键字:消息 之间 视图 js      更新时间:2023-09-26

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

有没有办法在不参数化视图的情况下解决这个问题?

当前代码如下:

在设置中.js:

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

在仪表板中.js:

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

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

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

为了补充当前的答案,在我的一个 Backbone 应用程序中,我创建了一个中央集线器来监听事件。所以它是这样工作的

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

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

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

然后在设置中.js您可以针对 Hub 触发事件,如下所示:

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

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