Aurelia Unsubscribe Event Aggregator

Я использую Aurelia Framework с Typescript, а в event aggregator я могу публиковать и подписываться на каналы.

Проблема в том, что я не могу отказаться от подписки на канал.

Примечание. Все формы метода подписки возвращают функцию удаления. Вы можете вызвать эту функцию, чтобы избавиться от подписки и прекратить прием сообщений. Хорошее место для размещения - либо в режиме просмотра, либо при отключении обратного вызова, если он управляется маршрутизатором, либо в его отключенном обратном вызове, если это какая-либо другая модель представления.

Это взято из официального сайта документации aurelia, и я действительно не понимаю, как это реализовать.

Я пошел на канал aurelia gitter, и я нашел 3 обсуждения об этом, где один из них привел следующий пример для отказа от подписки:

sub = ea.subscribe();

//unsubscribe the event
sub();

Проблема заключается в том, что этот код не работает в TypeScript.

Как отказаться от подписки на event aggregator в Typescript?

Теперь, используя этот код

    @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 раза, он будет выполнен три раза.

Итак: Почему мой метод подписчика срабатывает несколько раз? Как отказаться от подписки на event-aggregatoor в Typescript?

Спасибо!

Ответ 1

10/14/2015 EDIT

Функция класса EventAggregator subscribe возвращает объект var subscription = eventAggregator.subscribe('some event', value => alert(value));

Вам нужно сохранить ссылку на объект подписки, чтобы вы могли уничтожить подписку, когда она больше не нужна.

В модели представления идеальное время для подписки на событие - это attached. Точно так же прекрасное время для отмены подписки - это когда он detached.

Здесь ваша быстрая модель просмотра Home выглядела бы, если бы она использовала этот шаблон (примечание: я уронил классы 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();
  }
}

Ответ 2

Вам нужно отписаться от деактивировать()/detach(), насколько мне известно, использование Typescript не меняет этого.