我在我的应用中使用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));
这是一个解决方案,但现在我有一个无法订阅的问题。如果我尝试取消订阅完全相同的绑定方法,就像您希望普通方法一样,则不会取消订阅。我的猜测是它无法将绑定方法相互比较。这总是导致我的方法仍被订阅。
我可以尝试的替代品或解决方案吗?
查看代码,该库混淆了订阅签名的回调函数。
在适当的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();