Angular 角度-向外部库注入/传递服务

Angular 角度-向外部库注入/传递服务,angular,typescript,dependency-injection,Angular,Typescript,Dependency Injection,我正在开发一个NPM包,为Material Datatable提供额外的功能。其中一个特性是可以传递一个方法,当用户单击特定单元格时将执行该方法 以下是财产的定义: 内外库 向其传递一个简单的方法,如警报或console.log,效果很好: 来自使用库的项目 但是,如果我传递的方法包含对服务的调用,则库对该服务一无所知,并且该方法崩溃: { click: this.openDialog } ... openDialog(element: any, property: string,

我正在开发一个NPM包,为Material Datatable提供额外的功能。其中一个特性是可以传递一个方法,当用户单击特定单元格时将执行该方法

以下是财产的定义:

内外库 向其传递一个简单的方法,如警报或console.log,效果很好:

来自使用库的项目 但是,如果我传递的方法包含对服务的调用,则库对该服务一无所知,并且该方法崩溃:

{
    click: this.openDialog
}

...

openDialog(element: any, property: string, mouseEvent: MouseEvent) {
    this.matDialog.open(DialogComponent);
}
错误类型错误:无法读取未定义的属性“open”

如何动态地向外部库提供任何类型的服务?图书馆如何知道使用哪种服务


或者我走错方向了?我曾尝试简单地使用事件发射器并将值传递给父组件,但它有局限性(在每个单元格上调用,父组件中需要额外的逻辑)

这里有两个问题。第一,它不知道类型,因为您没有参数化
单击
处理程序(签出)。第二,您使用的是一个普通函数定义,它隐式地绑定调用它的上下文。因此,如果您的外部库正在启动
单击
并且
this.openDialog
与此关联,则库基本上将查找
this.matDialog.open(DialogComponent)自身内部(它找不到,因此未定义)

我建议试试这个:

{
    click: this.openDialog.bind(this)
}

...

openDialog(element: any, property: string, mouseEvent: MouseEvent) {
    this.matDialog.open(DialogComponent);
}

不确定,请尝试
单击:this.openDialog.bind(this)
。如果你明白我的意思,这可能是错误的。哈哈,是的,我明白你的意思。你的把戏成功了,谢谢!我第一次看到这个
bind
语法时,非常漂亮useful@Robouste是的,JavaScript中的上下文可能会让人困惑,但要点是:正常函数=执行时绑定箭头函数=定义时绑定这里还有更多内容,但这应该会有所帮助。
{
    click: this.openDialog
}

...

openDialog(element: any, property: string, mouseEvent: MouseEvent) {
    this.matDialog.open(DialogComponent);
}
{
    click: this.openDialog.bind(this)
}

...

openDialog(element: any, property: string, mouseEvent: MouseEvent) {
    this.matDialog.open(DialogComponent);
}