2013-02-21 21 views
19

Mam usługzmienna ta nie jest dostępna w 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 
     }); 
    } 
} 

nawet w kontrolerze jego dostępne

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

Czy ktoś może mi wyjaśnić dlaczego „this.list” nie jest osiągalny w ciągu kątowa .foreach i jak mogę uzyskać dostęp do "this.list"?

Odpowiedz

44

Ostatni parametr w funkcji angular.forEach (zobacz http://docs.angularjs.org/api/angular.forEach) jest kontekstem dla this. Więc chcesz coś takiego:

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

    this.list = []; 

    this.execute = function() { 

     //this.list is reachable here 

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

    } 
} 
+0

Dziękuję, to działa, zawsze jest coś do nauczenia. Myślałem, że już wiem wszystko od Angular-Docs. –

+1

Dzięki, kątowe dokumenty nie miały nic wspólnego z tym, jak wprowadzić zmienną zasięgu do pętli. – Churk

+0

Dzięki, działa;) –

3

Powodem this.list nie jest dostępny w foreach jest fakt, że kontekst dla tego wywołania funkcji nie zmieniło. Działa wewnątrz metody execute, ponieważ ta metoda jest częścią tego samego kontekstu co lista.

Z powodu wszystkich zamknięć przypisałbym kontekst this do innej zmiennej, którą można później wywołać. Coś takiego:

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

Jest to nieco bardziej ogólne rozwiązanie niż przekazując kontekst, w ramach foreach wywołanie metody i będzie działać w innych sytuacjach związanych z zamknięciem.

+0

Dziękuję, to też działa. –

Powiązane problemy