如何将组件中的 Angular2 方法作为第三方库的回调方法传递?

Posted

技术标签:

【中文标题】如何将组件中的 Angular2 方法作为第三方库的回调方法传递?【英文标题】:How can I pass an Angular2 method in my component as the callback method of a third party library? 【发布时间】:2018-03-22 16:07:21 【问题描述】:

我有一个引用第三方库的 Angular2 应用程序。我通过以下方式在我的一个组件中引用该库:

声明 var thirdPartyLib: any;

接下来我将按钮的点击绑定到下面的方法。

按钮点击() 第三方库.open( url: 'url 在这里', 消息监听器:函数(事件数据) this.processResponse(eventData); ); 过程响应(事件数据:任何)...

问题是,当它触发 messageListener 函数时,我收到一个错误,它“无法读取未定义的属性 processResponse”。我知道“this”的范围存在问题,但是如何从该函数中调用我的组件上的该方法?还是有另一种方法可以完全做这样的事情?

为了完整起见,我还尝试了以下方法:

按钮点击() var myMethod = this.processResponse; 第三方库.open( url: 'url 在这里', 消息监听器:我的方法 ); 过程响应(事件数据:任何)...

这种方法的问题是processResponse 调用一个服务为this.someService.whatever(eventData.something);。使用这种方法会引发同样的错误,但现在是 this.someService

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

我认为,你有两个选择。

1. Arrow functions

它们将保留对this 中当前对象的引用。

buttonClick() 
    thirdPartyLib.open(
        url: 'url goes here',
        messageListener: (eventData) => 
            this.processResponse(eventData);
        
    );


processResponse(eventData: any) ...

甚至更短的形式:messageListener: eventData => this.processResponse(eventData)

2。 “那个”模式

that(或其他名称)变量可能持有对当前对象的引用。

buttonClick() 
    const that = this;
    thirdPartyLib.open(
        url: 'url goes here',
        messageListener: function(eventData) 
            that.processResponse(eventData);
        
    );


processResponse(eventData: any) ...

【讨论】:

以上是关于如何将组件中的 Angular2 方法作为第三方库的回调方法传递?的主要内容,如果未能解决你的问题,请参考以下文章

angular2怎么使用第三方的库

将组件作为“参数”传递给Angular 2中的另一个组件

如何将一个组件放入Angular2中的另一个组件中?

如何在 Angular 2 组件中访问全局变量

Angular 2 - 如何将依赖项注入到自定义类中,该类不是组件并且不作为服务公开

在 Angular 2 应用程序中使用本地 npm 存储库中的组件