ti-enxame.com

variável não está acessível em angular.forEach

Eu tenho um serviço

app.service('myService', function() {
    this.list = [];
    this.execute = function() {
        //this.list is reachable here
        angular.forEach(AnArrayHere, function(val, key) {
           //this.list is not reachable here
        });
    }
}

mesmo no controlador sua acessível

function Ctrl($scope, myService) {
    $scope.list = myService.list;
}

Alguém pode me explicar por que "this.list" não está acessível no angular.foreach e como posso acessar "this.list"?

22
Vural

O último parâmetro no angular.forEach (Veja http://docs.angularjs.org/api/angular.forEach ) a função é o contexto para this. Então você vai querer algo assim:

app.service('myService', function() {

    this.list = [];

    this.execute = function() {

        //this.list is reachable here

        angular.forEach(AnArrayHere, function(val, key) {
           //access this.list
        }, this);

    }
}
52
dnc253

O motivo this.list não está acessível no foreach é porque o contexto para essa chamada de função mudou. Ele funciona dentro do método execute, pois esse método faz parte do mesmo contexto que a lista.

Devido a todos os fechamentos, eu atribuiria o contexto this a outra variável que você poderá chamar mais tarde. Algo assim:

app.service('myService', function() {

    var self = this;
    self.list = [];

    self.execute = function() {
        //this.list and self.list are reachable here
        angular.forEach(AnArrayHere, function(val, key) {
           //self.this == this.list
        });
    }
}

Essa é uma solução um pouco mais geral do que passar o contexto como parte da chamada do método foreach e funcionaria em outras situações relacionadas ao fechamento.

6
Coin_op