Переменная недоступна в 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"?
Ответы
Ответ 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 и будет работать в других ситуациях, связанных с закрытием.