2016-06-06 17 views
1

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.

+0

[ '$ 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

+1

Verwenden Sie den $ Timeout-Dienst. SetTimeout löst keine Anwendung aus – yeouuu

+0

Was @yeouu sagte - Sie injizieren den $ Timeout-Dienst in Ihre Demo, aber Sie rufen SetTimeout auf. Ersetzen Sie setTimeout durch $ timeout. – RamblinRose

Antwort

0

Sie müssen $scope.$apply(); am Ende Ihres Timeouts setzen, um ein Update auszulösen. Alternativ können Sie den injizierbaren $timeoutservice anstelle von setTimeout verwenden und $ apply wird automatisch aufgerufen.

jsbin

+0

Das Timeout war nur um die asynchrone Operation zu simulieren. Der Schlüssel ist, dass wir das Update mit apply auslösen müssen. In diesem Fall verpackte ich Dinge mit einem Service über socketio. Da socketio extern ist, muss angular $ apply aufgerufen werden. Vielen Dank – kitimenpolku