Typescript的强类型事件包。如何将绑定的handelers添加到事件中

问题描述 投票:1回答:1

我在我的应用中使用strongly typed events软件包。该软件包对于事件及其处理方式非常有用。我在我的应用中使用了这样的软件包。

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
 }
}

这仅适用于一件事。如果您尝试在组件更新功能中访问“ this”。您不会获得该组件,但会得到该事件。所以我尝试了像这样的function.bind(component)方法。

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

这是一个解决方案,但现在我有一个无法订阅的问题。如果我尝试取消订阅完全相同的绑定方法,就像您希望普通方法一样,则不会取消订阅。我的猜测是它无法将绑定方法相互比较。这总是导致我的方法仍被订阅。

我可以尝试的替代品或解决方案吗?

typescript events strongly-typed-dataset
1个回答
0
投票

查看代码,该库混淆了订阅签名的回调函数。

在适当的subscribe->cancel体系结构中,方法subscribe应该始终返回Subscription对象,以允许安全的方式取消订阅。

由于问题已经解决了一段时间,因此我建议您使用备用事件库sub-events

特别是对于信号,根据此处的Signals页面,我们可以定义通用信号类型:

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();
© www.soinside.com 2019 - 2024. All rights reserved.