Angular 5 this undefined inside array.filter

Posted

技术标签:

【中文标题】Angular 5 this undefined inside array.filter【英文标题】: 【发布时间】:2018-06-20 01:54:53 【问题描述】:

这是我正在尝试的代码

search()
   this.toDisplay = this.products.filter(function(x)
      return this.checkCondition(x.price, condition);
   

是复杂的条件,如大于、范围、最大值,根据条件数判断条件是否满足,返回真假;

checkCondition(item, condition)
  switch(conditoin)
    case 1:  ... brea;
    case 2:  ... brea;
    case 3:  ... brea;

  
  return status;

问题是当我在过滤器中使用this.checkCondition 时,总是抛出未定义的checkCondition 属性,意味着this 未定义。

我检查了this总是未定义,那么如何调用过滤器内部的函数?

【问题讨论】:

【参考方案1】:

使用arrow function 以便this 自动正确绑定。由于您标记了 TypeScript,因此如果您计划支持仅支持 ES5 及以下版本的浏览器,则可以转换箭头函数:

search()
   this.toDisplay = this.products.filter(x => this.checkCondition(x.price, condition));

如果不想使用箭头函数,可以捕获this

search()
   var selfRef = this;
   this.toDisplay = this.products.filter(function(x) 
      return selfRef.checkCondition(x.price, condition);
   );

另一种方法是使用bind

search()
   this.toDisplay = this.products.filter(function(x) 
      return selfRef.checkCondition(x.price, condition);
   .bind(this));

【讨论】:

箭头功能还不是所有浏览器都支持,特别是在不同设备上,感谢您的快速回复 @AliAdravi 由于您使用的是 TypeScript,因此您实际上不必担心;箭头函数将自动转换为 if you tell it to 支持的任何内容。 你让我很开心,即使在 Type Script 中,我也总是害怕使用箭头功能,非常感谢这一点【参考方案2】:

另一种方法是将“this”分配给过滤器调用之外的局部变量(为此,人们通常使用“that”或“self”作为标识符)。

例子:

search()
   var that = this;
   this.toDisplay = this.products.filter(function(x)
      return that.checkCondition(x.price, condition);
   

【讨论】:

我实际上在您发布的同时将此作为编辑添加到我的答案中。如果你不能使用箭头函数,这绝对是一个很好的解决方案。不过,您应该添加一个示例。

以上是关于Angular 5 this undefined inside array.filter的主要内容,如果未能解决你的问题,请参考以下文章

在 StackBlitz 中出现“this._ngZone is undefined”错误

Angular 5服务变量未定义

Angular Viewchild undefined

变量更改后Angular 5 HTML未更新

如何修复undefined不是一个对象 - 'this.navigation.openDrawer'

CKEDITOR5 - Angular8:TypeError:this.editor.create 不是函数