首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >typescript的强类型事件包。如何向事件添加绑定的处理程序

typescript的强类型事件包。如何向事件添加绑定的处理程序
EN

Stack Overflow用户
提问于 2020-01-09 20:57:04
回答 1查看 67关注 0票数 1

我在我的应用中使用了strongly typed events包。这个包对于它的事件以及它处理这些事件的方式非常有用。我在我的应用程序中使用了这样的包。

代码语言:javascript
运行
复制
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(组件)方法,如下所示。

代码语言:javascript
运行
复制
onUpdate.sub(component.Update.bind(component));

这是一个解决方案,但现在我有一个问题,取消订阅。如果我尝试取消订阅完全相同的绑定方法,就像您想要正常方法一样,它不会取消订阅。我的猜测是它不能相互比较绑定的方法。这总是导致我的方法仍然被订阅。

我可以尝试任何替代方案或解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-10 15:45:36

从代码中可以看出,该库混淆了订阅签名的回调函数。

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

由于这个问题已经公开了一段时间,我将推荐一个替代事件库sub-events供您考虑。

对于信号,根据那里的Signals页面,我们可以定义一个通用的信号类型:

代码语言:javascript
运行
复制
class Signal extends SubEvent<void> {} // reusable Signal type

然后我们可以将您的代码更新为:

代码语言:javascript
运行
复制
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
    }
}

然后,当您需要取消订阅时,您只需执行以下操作:

代码语言:javascript
运行
复制
sub.cancel();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59664493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档