Отписаться можно заметить в одном теге отключить все? - PullRequest
1 голос
/ 26 сентября 2019

Я построил SPA с Riot.js, который визуализирует данные, полученные частной системой обмена сообщениями.Чтобы теги реагировали на изменения, я создал глобальную наблюдаемую (riot.ob) в контексте 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');? 1015 *

1 Ответ

1 голос
/ 26 сентября 2019

Согласно исходному коду метода 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 );
})
...