array.find函数,防止访问父类“ this”对象

时间:2018-07-18 10:30:36

标签: angular typescript scope

我在一个角度分量内具有此功能。一旦尝试查询“ myData.Order3”数组,就无法从“查找”功能中访问“此”。 'this'报告为未定义,而父函数中其他对'this'的引用也可以。

这显然是一个范围确定的问题,但是在解决它时遇到了问题。

public toggle():void {
    this.freq.toggle();
    this.checkState().subscribe(response => {
        console.log(this.freq.frequency);
        this.myData = response as ArrayCast;
        if (this.myData.Order3.find(function(ele) {
            return ele == this.freq.frequency; // <= "this" reports as undefined
        })){
                this.toggleStyle="ui-button-danger";
        }
        console.log(this.myData);
    });
}

4 个答案:

答案 0 :(得分:1)

使用Lambda表达式=>代替function

if (this.myData.Order3.find((ele) => ele === this.freq.frequency))

答案 1 :(得分:1)

尝试一下:

    public toggle():void {
        this.freq.toggle();
        this.checkState().subscribe(response => {
            console.log(this.freq.frequency);
            this.myData = response as ArrayCast;
            if (this.myData.Order3.find((ele) => ele == this.freq.frequency)){
                    this.toggleStyle="ui-button-danger";
            }
            console.log(this.myData);
        });
    }

答案 2 :(得分:0)

这是因为引起错误的this未引用同一对象。幸运的是,有几种方法可以解决此问题。

  1. 使用箭头=>函数,因为它们在创建时不会绑定this。 (此外,当您调用subscribe函数时,您已经使用了它。

this.myData.Order3.find((ele) => ele === this.freq.frequency)

  1. 创建对this的引用,以便您可以引用回同一对象。

function foo() {
    var that = this;
    function bar() {
        console.log(that);
    }
}

答案 3 :(得分:0)

虽然这里给出了正确的答案,但是没有人解释原因。当使用dependencies { ... implementation project(':react-native-fbsdk') } 实际上是anonymous function时,因此您正在为Object创建新的作用域,这就是我们失去“期望的” this范围的原因。为this分配适当范围的方法很少。我认为,最干净的方法是使用上面提到的arrow function expression,以保持this的当前范围。还有一种使用this的方法,该方法只是将当前作用域绑定到.bind(this),所以看起来像

function

这是兼容性的好方法,因为箭头函数是array.find(function(el) { ... }.bind(this)); 表达式,因此并不是每个浏览器都可以正确处理此问题,因此,如果您不使用polyfill(但是使用angular时,您不必担心这样)最好使用ES6

还有第三种选择,例如.bind(this)之类的某些方法具有第二个参数array.find, array.forEach...,这仅表示您可以在其中传递thisArg,这将是{{1} }

第一个选项

Object

第二个选项

this

第三种选择

if (this.myData.Order3.find(ele => ele == this.freq.frequency))
相关问题