23

我有服务

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

有人可以解释一下为什么在 angular.foreach 中无法访问“this.list”以及如何访问“this.list”吗?

4

2 回答 2

55

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

    }
}
于 2013-02-21T21:59:22.230 回答
6

在 foreach 中无法访问的原因this.list是该函数调用的上下文已更改。它在方法内部工作,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 方法调用的一部分传递的更通用的解决方案,并且可以在其他与闭包相关的情况下工作。

于 2013-02-21T22:02:55.383 回答