Аурелия Отписаться
Я использую Aurelia Framework
с Typescript
и в event aggregator
Я могу публиковать и подписываться на каналы.
Проблема в том, что я не могу отписаться от канала.
Примечание. Все формы метода подписки возвращают функцию dispose. Вы можете вызвать эту функцию, чтобы избавиться от подписки и прекратить прием сообщений. Хорошее место для размещения - либо в деактивированном обратном вызове модели представления, если им управляет маршрутизатор, либо в отдельном обратном вызове, если это любая другая модель представления.
Это взято с официального сайта документации aurelia, и я не совсем понимаю, как это реализовать.
Я зашел на канал aurelia gitter и нашел 3 обсуждения на эту тему, где один из них привел следующий пример отказа от подписки:
sub = ea.subscribe();
//unsubscribe the event
sub();
Проблема в том, что этот код не работает в TypeScript.
Как отписаться от event aggregator
в машинописи?
Теперь, используя этот код
@inject(Publisher, Subscriber)
export class Home {
publisher: Publisher;
subscriber: Subscriber;
channelName = "testChannel";
constructor(pub: Publisher, sub: Subscriber) {
this.publisher = pub;
this.subscriber = sub;
this.subscriber.subscribe(this.channelName);
this.publisher.publish(this.channelName, "Ana are mere");
}
}
@inject(EventAggregator)
export class Publisher {
eventAggregator: EventAggregator = null;
constructor(agg: EventAggregator) {
this.eventAggregator = agg;
}
publish(channelName: string, object: Object) {
this.eventAggregator.publish(channelName, object);
}
}
@inject(EventAggregator)
export class Subscriber {
eventAggregator: EventAggregator = null;
constructor(agg: EventAggregator) {
this.eventAggregator = agg;
}
subscribe(channelName: string) {
this.eventAggregator.subscribe(channelName, object => {
//TODO do something with received object
alert(object);
});
}
unsubscribe(channelName: string) {
debugger;
}
}
при выполнении Home
Компонент, метод для подписки не выполняется только один раз, но столько раз, сколько вызван cosntructor. Итак, если я был на домашней странице 3 раза, она будет выполнена 3 раза.
Итак: Почему мой метод подписчика срабатывает несколько раз? Как отписаться от event-aggregatoor
в TypeScript?
Спасибо!
2 ответа
14.10.2015 РЕДАКТИРОВАТЬ
Класс EventAggregator subscribe
Функция возвращает объект "подписка" "распоряжение":
var subscription = eventAggregator.subscribe('some event', value => alert(value));
Вам нужно сохранить ссылку на объект подписки, чтобы вы могли уничтожить подписку, когда она больше не нужна.
В модели представления идеальное время для подписки на событие - это когда attached
, Кроме того, идеальное время для отказа от подписки, когда это detached
,
Вот то, что ваш Home
view-модель будет выглядеть так, как если бы она использовала этот шаблон (примечание: я отбросил ваши классы Subscriber и Publisher, потому что я думаю, что они добавляют ненужную сложность к EventAggregator и затрудняют объяснение решения вашей проблемы).
@inject(EventAggregator)
export class Home {
eventAggregator: EventAggregator;
subscription: { dispose: () => void };
constructor(eventAggregator: EventAggregator) {
this.eventAggregator = eventAggregator;
}
attached() {
this.subscription = this.eventAggregator.subscribe('some event', value => alert(value));
}
detached() {
this.subscription.dispose();
}
}
Вы должны отписаться от deactivate()/detach(), насколько я знаю, использование Typescript не меняет этого.