2017-05-11 8 views
11

Wie kann ich this.firms in einem Daten forEach() anrufen?Angular2 forEach kann Eigenschaft lesen

Ich weiß, wie dies in Angular1 zu tun, aber nicht mit meinem aktuellen Projekt in Angular 2.

Derzeit funktioniert es gut außerhalb des forEach, aber nicht innerhalb.

console.log(this.firms[0].name); // works 
    var a = 0; 
     console.log("--------------"); 

    data.forEach(function (eachObj) { 
     console.log("firms check!"); 
     console.log(this.firms); // not working 
     a = a + eachObj.income; 
     eachObj.name = this.firms[data.firmid - 1].name; // wont work 
    }); 

Fehler:

Cannot read property 'firms' of undefined 
+0

Bitte geben Sie uns https://plnrkr.co/edit/ – SjaakvBrabant

+1

Mögliche Duplikate von [Passing scope for forEach] (http://stackoverflow.com/questions/) 19733758/passing-scope-to-foreach) – Erazihel

Antwort

18

Der Kontext this ist nicht in der anonymen Funktion injiziert durch die forEach() genannt. Deshalb ist this nicht definiert.

Sie können entweder die arrow function verwenden, wenn Sie ES6 Funktionen verwenden, wie es den Kontext in der Funktion hält:

data.forEach(eachObj => { 
    console.log("firms check!"); 
    console.log(this.firms); 
    a = a + eachObj.income; 
    eachObj.name = this.firms[data.firmid - 1].name; 
}); 

Oder einfach den Kontext binden direkt:

data.forEach(function (eachObj) { 
    console.log("firms check!"); 
    console.log(this.firms); 
    a = a + eachObj.income; 
    eachObj.name = this.firms[data.firmid - 1].name; 
}.bind(this)); 

bearbeiten:

Wie von zeroflagL erwähnt, können Sie den Kontext einfach an dieübergeben:

data.forEach(function (eachObj) { 
    console.log("firms check!"); 
    console.log(this.firms); 
    a = a + eachObj.income; 
    eachObj.name = this.firms[data.firmid - 1].name; 
}, this); 
+0

wird das asynchron funktionieren ?? –

1

Das ist das grundlegende Beispiel für Umfang in Javascript. Innerhalb Ihrer Funktion bezieht sich this auf den Kontext der Funktion selbst. Die Außenwelt ist nicht zugänglich.

Da Sie Typoskript mit Winkel verwenden können Sie nur verwenden, um eine arrow function:

data.forEach((eachObj) => { 
    console.log("firms check!"); 
    console.log(this.firms); // not working 
    a = a + eachObj.income; 
    eachObj.name = this.firms[data.firmid - 1].name; // wont work 
}); 

Dies wird den Umfang und Ihre this ist im Inneren zur Verfügung zu bewahren. Im Klar javascript Sie so etwas tun könnte:

var that = this; 

data.forEach(function (eachObj) { 
    console.log("firms check!"); 
    console.log(that.firms); // not working 
    a = a + eachObj.income; 
    eachObj.name = that.firms[data.firmid - 1].name; // wont work 
}); 
2

Sie können versuchen, die data zu sein und Array zu machen

wie so:

Array.from(data).forEach((eachObj) => { 
    console.log("firms check!"); 
    console.log(that.firms); 
    eachObj.name = that.firms[data.firmid - 1].name; 
}) 

Dies funktioniert auch

Verwandte Themen