首页 > 解决方案 > 在一个标签中取消订阅 observable 会禁用所有标签吗?

问题描述

我用 Riot.js 构建了一个 SPA,它可以可视化由专有消息传递系统接收的数据。为了使标签对更改做出反应,我riot.ob在上下文中创建了一个全局 observable ( ),riot当从服务器接收到新值时触发消息:

riot.ob.trigger('valueUpdate', stationId, datapointId, value);

如果消息是针对此标签的,则有许多不同的标签订阅此事件并触发更新:

riot.ob.on('valueUpdate', function (stationId, datapointId, value) {
    if (stationId == self.stationId && datapointId == self.datapoint.id) {
        self.value = value;
        self.update();
    }
});

这工作得很好。当我在我的应用程序中导航时会出现问题,这意味着我需要在特定区域卸载标签并安装其他东西。当我像上面那样卸载标签时,我需要取消订阅valueUpdate事件,所以我使用这个:

this.on('unmount', function () {
    riot.ob.off('valueUpdate');
})

但是现在所有其他仍然安装在其他地方的标签也会自动取消订阅,并且不再监听这个valueUpdate事件。如何仅取消订阅单个标签的事件处理函数?我是否必须创建一个命名函数并将其传递给riot.ob.off('valueUpdate');某种方式?

标签: javascripteventsobservableriot.js

解决方案


根据方法的源代码off您应该传递一个要取消订阅的回调函数作为第二个参数。否则,将删除所有侦听器。

下一个代码应该可以按预期工作:

var callback = function (stationId, datapointId, value) {
    if (stationId == self.stationId && datapointId == self.datapoint.id) {
        self.value = value;
        self.update();
    }
}

riot.ob.on('valueUpdate', callback);

this.on('unmount', function () {
    riot.ob.off('valueUpdate', callback );
})

推荐阅读