在一个标签中取消订阅可观察到禁用所有?

Unsubscribe observable in one tag disables all?

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

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');

根据方法 offsource code,您应该将要取消订阅的回调函数作为第二个参数传递。否则,所有监听器将被删除。

接下来的代码应该会如您所愿:

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 );
})