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

标签 javascript events observable riot.js

我用 Riot.js 构建了一个 SPA,它可视化专有消息系统接收的数据。为了使标签对变化使用react,我在 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');

最佳答案

根据 source code在方法 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 );
})

关于javascript - 在一个标签中取消订阅可观察到禁用所有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112648/

相关文章:

java - 在 Swing 中显示所有鼠标悬停事件?

c# - 如何更好地使用 KeyDown 事件验证?

javascript - Angular2 - 将 'activatedRoute.params' 变成 promise

JavaScript 形式 : call a specified submit button when a select field changes value

使用模块模式时的 Javascript mixins

events - 如何在python中捕获打印机事件

dart - 避免在 Polymer 中使用 @observable

android - RxJava 和 Retrofit 处理多个平面图的分页

javascript - 如何在输入字段中放置默认文本,同时保留 JS 表单验证功能

javascript - 未找到 React Redux Store 变量,即使它在存储中