通过 Angular 模板传递回调函数时保留此上下文

Posted

技术标签:

【中文标题】通过 Angular 模板传递回调函数时保留此上下文【英文标题】:Preserving this context when passing a callback function via Angular template 【发布时间】:2021-11-27 23:13:14 【问题描述】:

我的组件定义了一个接收回调作为参数的方法

  sendDeleteRequest(btn: MatButton, cbk: any) 
    cbk()()
  

  f() 
    console.log(this.owner)
  

回调是从组件模板传递过来的

<button mat-raised-button (click)="sendDeleteRequest(deleteCredBtn, f)" color="warn" #deleteCredBtn="matButton">Delete</button>

但是f 函数会引发ERROR TypeError: this is undefined

如何保留上下文?

我尝试了什么

    this 保存在f 函数内的self 变量中以打印self.ownerf 返回一个 lambda 函数 从sendDeleteRequest 调用cbk 时使用bind(this)

他们都没有工作。

【问题讨论】:

【参考方案1】:

有趣。我不知道 this 上下文在将函数作为参数从视图模板传递时被删除了。

但是,您可以直接在模板中使用this 传递对组件实例的引用,这将允许您执行类似于以下的操作:

  @Component() export class MyComp 
    testStr = "Value on componentContext";
    
    sendDeleteRequest(btn: MatButton, cbk: Function, componentContext: MyComp)
    
      cbk.bind(componentContext)();
    
    
    test() 
    
      console.log(this.testStr);
    

  
<button mat-raised-button (click)="sendDeleteRequest(deleteCredBtn, test, this)" color="warn" #deleteCredBtn="matButton">Delete</button>

感觉有点hacky,但它似乎按预期工作。

【讨论】:

以上是关于通过 Angular 模板传递回调函数时保留此上下文的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax、Django 将上下文传递到模板中

将回调函数作为字符串传递,同时保留作用域链

如何在jquery ajax成功回调函数中传递上下文

使用类方法作为回调时的 Promise.then 执行上下文

回调函数

将范围传递给回调函数/绑定