Аурелия Отписаться

Я использую 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 не меняет этого.

Другие вопросы по тегам