Строго типизированный пакет событий для машинописи. Как добавить связанных гендлеров на мероприятие - PullRequest
1 голос
/ 09 января 2020

Я использую пакет строго типизированных событий в своем приложении. Этот пакет действительно полезен для его событий и того, как он их обрабатывает. Я использовал такой пакет для своего приложения.

let onUpdate = new SignalDispatcher = new SignalDispatcher();
let component = new Component();
onUpdate.sub(component.Update);

void Update(){
 this.onUpdate.dispatch();
}

class Component {
 public Update(){
  //do stuff
 }
}

Это работает только для одной вещи. Если вы попытаетесь открыть «это» в функции обновления компонента. Вы не получите компонент, но событие. Поэтому я попробовал метод function.bind (component) следующим образом.

onUpdate.sub(component.Update.bind(component));

Это решение, но теперь у меня проблема с отпиской. Если я попытаюсь удалить тот же самый связанный метод, так же, как вы хотели бы нормальный метод, он не отписался бы. Я предполагаю, что он не может сравнивать связанные методы друг с другом. Это всегда приводит к тому, что мой метод все еще подписан.

Любые альтернативы или решения, которые я могу попробовать?

1 Ответ

1 голос
/ 10 марта 2020

Глядя на код, эта библиотека путает функции обратного вызова для подписей подписки.

В правильной архитектуре subscribe->cancel метод subscribe всегда должен возвращать объект Subscription, чтобы обеспечить безопасный способ отмены подписки.

Поскольку вопрос открыт для какое-то время я предложу альтернативную библиотеку событий под-событий на ваше рассмотрение.

Специально для сигналов, согласно странице Сигналы , мы можем определить общие c тип сигнала:

class Signal extends SubEvent<void> {} // reusable Signal type

Тогда мы можем обновить ваш код следующим образом:

const onUpdate = new Signal();

const component = new Component();

// you can bind an event to the right context in 2 ways:
const sub = onUpdate.subscribe(component.Update.bind(component));
// or alternatively:
const sub = onUpdate.subscribe(component.Update, {thisArg: component});


void Update() {
    this.onUpdate.emit(); // emit the event (signal)
}

class Component {
    public Update(){
        //do stuff
    }
}

А затем, когда вам нужно отменить подписку, вы просто делаете это:

sub.cancel();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...