在一个标签中取消订阅可观察到禁用所有?
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');
?
根据方法 off
的 source 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 );
})
我用 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');
?
根据方法 off
的 source 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 );
})