2014-04-27 14 views
5

Niedawno zacząłem uczyć się angularjs używając restangular, aby mówić do mojego restfull API (żagle). Problem, na który natrafiłem, polega na tym, że powtórzenie ng nie jest aktualizowane po zmianie listy w zakresie.Reakcja prostokątna i powtórzenie ng

Kontroler:

app.controller('UsersCtrl', ['UsersSvc', '$scope', function(UsersSvc, s) { 
    UsersSvc.getList().then(function (new_users) { 
     s.users = new_users; 
    }) 
    s.destroy = function (user) { 
     user.remove().then(function() { 
     s.users = _.without(s.users, user); 
    }); 
} 
}]); 

Usługa:

app.factory('UsersSvc', function(Restangular) { 
    return Restangular.all('users'); 
}); 

Szablon:

<div ng-controller="UsersCtrl"> 
    ... 
    <tr ng-repeat"user in users"> 
      <td>{{user.firstName}}</td> 
      <td>{{user.lastName}} </td> 
      <td>{{user.emailAddress}}</td> 
      <td>{{user.age}}</td> 
    </tr> 
    ... 
</div> 

Kiedy sprawdzać zakres tablica restangular obiektów jest poprawnie przypisany do zakresu użytkowników kontroler, ale szablon odmawia aktualizacji.

góry dzięki

+0

nie widzę, gdzie zdefiniowano 'usr.users'. Czy możesz dodać tę część? – Sebastian

+0

Część usr była literówka podczas kopiowania. Mam na myśli zmienną użytkowników w zakresie UsersCtrl. – rtemperv

+0

Mam rację myśląc, że 's' odnosi się do' $ scope'. Dlaczego nie spróbować konsoli. Zaloguj się w wyniku obietnicy, zobacz, co otrzymasz – David

Odpowiedz

4

angularjs (i JavaScript) dbają o referencje vs. nadpisuje. Dla bezpieczeństwa zawsze ustawiam początkowo zmienne zasięgu, a następnie aktualizuję, używając angular.copy() lub Restangular.copy() (jeśli ustawiany jest obiekt o przekroju kwadratowym).

Poniżej opisuję, w jaki sposób powinienem zrestrukturyzować kontroler, aby zapewnić, że wiązanie + cykle trawienne pozostaną połączone.

(Należy pamiętać, że przemianowany s do „tradycyjnych” $scope dla łatwiejszego odczytu dla każdego innego)

app.controller('UsersCtrl', ['$scope', 'UsersSvc', 'Restangular', function($scope, UsersSvc, Restangular) { 

    // we're expecting a list, so default as array 
    $scope.users = []; 

    UsersSvc.getList().then(function (new_users) { 
     // In normal $resource/ng projects use: angular.copy(src, dst) but 
     // Restangular has an issue when using angular.copy(): 
     // https://github.com/mgonto/restangular/issues/55 
     // so use their version of copy(): 
     Restangular.copy(new_users, $scope.users); 
    }); 

    $scope.destroy = function (user) { 
     user.remove().then(function() { 
     $scope.users = _.without($scope.users, user); 
    }); 
} 
}]); 
+0

Ale teraz wstrzykujesz usługę i Restangular. – ceebreenk

+0

@honeycomb masz rację, przełączyłem się na http://angular-data.pseudobry.com, co jest niesamowite. Ale wyobrażam sobie, że możesz zawrzeć Restangular w innym miejscu twojej kanciastej aplikacji, testowałem, ale przeszedłem na emeryturę Restanguar;) – electblake