Подтвердить что ты не робот

Переменная недоступна в angular.forEach

У меня есть служба

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
        });
    }
}

даже в контроллере доступный

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

Может кто-нибудь объяснить мне, почему "this.list" недоступен в angular.foreach и как я могу получить доступ к "this.list"?

4b9b3361

Ответ 1

Последний параметр в angular.forEach (см. http://docs.angularjs.org/api/angular.forEach) - это контекст для this. Поэтому вам нужно что-то вроде этого:

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

    this.list = [];

    this.execute = function() {

        //this.list is reachable here

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

    }
}

Ответ 2

Причина this.list недоступна в foreach, потому что контекст для этого вызова функции изменился. Он работает внутри метода execute, поскольку этот метод является частью того же контекста, что и список.

Из-за всех замыканий я бы назначил контекст this другой переменной, которую вы затем можете вызвать позже. Что-то вроде этого:

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
        });
    }
}

Это немного более общее решение, чем передача контекста как часть вызова метода foreach и будет работать в других ситуациях, связанных с закрытием.