javascript - 在一个标签中取消订阅 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');
某种方式?
解决方案
根据方法的源代码,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 );
})
推荐阅读
- angular - ./server.ts 中的错误未找到模块:错误:无法解析“./dist/server/main.bundle”
- php - 解析错误:语法错误,意外的 ';' 在第 24 行的 /etc/zabbix/web/zabbix.conf.php 中
- android - 适用于 Android 的 C/C++ 内存分配边界对齐
- ruby-on-rails - 如何 RSpec 测试设置的错误通知
- ajax - 如何为我的 ajax 获取输入值?
- graph - 在成本满足三角不等式的无向图中找到不超过 O(m+n log n) 中最小成本两倍的哈密顿循环
- javascript - 如何在 Firebase 5.0.4 中获取上传图片的 URL?
- vega - Vega 交互仪表板
- android - 根据时间戳删除firestore中的项目
- cloudkit - CloudKit 与未安装应用的用户共享