2014-04-27 2 views
5

Ho recentemente iniziato a imparare angularjs usando restangular per parlare con la mia restfull API (sails). Il problema su cui mi sono imbattuto è che la ng-repeat non si aggiorna dopo aver modificato l'elenco nell'ambito.Restangular response e ng-repeat

Controller:

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

Servizio:

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

Template:

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

Quando ho ispezionare il campo di applicazione della matrice di oggetti restangular viene assegnato correttamente per la portata degli utenti controller ma il modello si rifiuta di aggiornare.

Grazie in anticipo

+0

non riesco a vedere dove si è definito 'usr.users'. Puoi aggiungere anche questa parte? – Sebastian

+0

La parte usr era un refuso durante la copia. Mi riferisco alla variabile users sull'ambito UsersCtrl. – rtemperv

+0

Ho ragione nel pensare che 's' si riferisce a' $ scope'. Inoltre, perché non provare a console.log il risultato della promessa, guarda cosa ottieni – David

risposta

4

AngularJS (e JavaScript) preoccupano i riferimenti contro sovrascritture. Quindi, per sicurezza, ho sempre impostato inizialmente le variabili dell'ambito e poi l'aggiornamento utilizzando angular.copy() o Restangular.copy() (se si tratta di un oggetto Restangular impostato).

Di seguito è riportato il modo in cui ho effettuato il refactoring del controller per garantire che i binding e i cicli di digest restino collegati.

(Si prega di notare ho rinominato s al "tradizionale" $scope per una più facile lettura per tutti gli altri)

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

Ma ora stai iniettando il servizio e Restangular. – ceebreenk

+0

@honeycomb hai ragione, sono passato a http://angular-data.pseudobry.com che è fantastico. Ma immagino che potresti includere Restangular altrove nella tua app angolare, farei dei test ma sono andato in pensione Restanguar;) – electblake