Im Arbeiten an angularjs 1.4. Ich versuche, eine Frontend-Cache-Sammlung zu haben, die die Ansicht aktualisiert, wenn neue Daten eingefügt werden. Ich habe andere Antworten von hier Angularjs watch service object überprüft, aber ich glaube, dass ich das Array nicht überschreibe, was bedeutet, dass die Referenz die gleiche ist.AngularJS - Watch Service Änderungen nicht aktualisieren Ansicht
Der Code ist ganz einfach:
(function(){
var appCtrl = function($scope, $timeout, SessionSvc){
$scope.sessions = {};
$scope.sessions.list = SessionSvc._cache;
// Simulate putting data asynchronously
setTimeout(function(){
console.log('something more triggered');
SessionSvc._cache.push({domain: "something more"});
}, 2000);
// Watch when service has been updated
$scope.$watch(function(){
console.log('Watching...');
return SessionSvc._cache;
}, function(){
console.log('Modified');
}, true);
};
var SessionSvc = function(){
this._cache = [{domain: 'something'}];
};
angular.module('AppModule', [])
.service('SessionSvc', SessionSvc)
.controller('appCtrl', appCtrl);
})();
Ich dachte, dass die schmutzige Überprüfung die Änderungen fangen würde, ohne dass Beobachter mit. Immer noch setze ich den Beobachter, um zu überprüfen, ob etwas ausgeführt wird, sobald die setTimeout-Funktion ausgelöst wird. Ich sehe nur nicht, dass die Änderung erkannt wird.
Hier ist die jsbin. Ich verstehe nicht wirklich etwas oder mache einen wirklich rockigen Fehler.
[ '$ watchCollection'] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watchCollection) ist eine bessere Option in Ihrem Szenario. Unabhängig davon müssen Sie einen $ scope. $ Apply im async-Callback ausführen, damit Angular die Ansicht aktualisiert (siehe http://stackoverflow.com/questions/15112584/using-scope-watch-and-scope-apply-in) -angularjs für Details) – Rhumborl
Verwenden Sie den $ Timeout-Dienst. SetTimeout löst keine Anwendung aus – yeouuu
Was @yeouu sagte - Sie injizieren den $ Timeout-Dienst in Ihre Demo, aber Sie rufen SetTimeout auf. Ersetzen Sie setTimeout durch $ timeout. – RamblinRose