2016-06-06 3 views
1

Im работает с угловыми 1.4. Я пытаюсь создать коллекцию внешнего интерфейса, которая обновляет представление при вставке новых данных. Я проверил другие ответы отсюда Angularjs watch service object, но я считаю, что я не переписываю массив, а это означает, что ссылка такая же.AngularJS - Смотреть изменения услуги, не обновляющие вид

Код довольно прост:

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

})(); 

Я думал, что грязная проверка придется поймать изменения без использования каких-либо наблюдателя. Тем не менее, я поставил наблюдателя проверить, что что-то будет выполнено после срабатывания функции setTimeout. Я просто не вижу, что изменение обнаружено.

Адрес jsbin. Im действительно не понимает sth или делает действительно rockie ошибку.

+0

[ '$ watchCollection'] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watchCollection) является лучшим вариантом в вашем сценарии. Независимо от этого, вам нужно запустить $ scope. $ Применять в обратном вызове async, поэтому Angular обновляет представление (см. Http://stackoverflow.com/questions/15112584/using-scope-watch-and-scope-apply-in -angularjs для получения дополнительной информации) – Rhumborl

+1

использовать $ timeout. SetTimeout не запускает приложение – yeouuu

+0

. Что сказал @yeouuu - вы вводите услугу $ timeout в свою демонстрационную версию, но вы вызываете setTimeout. Замените setTimeout на $ timeout. – RamblinRose

ответ

0

Вам нужно положить $scope.$apply(); в нижней части вашего таймаута, чтобы вызвать обновление. В качестве альтернативы вы можете использовать инъектируемый $timeoutservice вместо setTimeout, а $ apply будет автоматически вызван.

jsbin

+0

Тайм-аут должен был просто имитировать асинхронный режим. Ключ в том, что нам нужно инициировать обновление с применением. В этом случае я обматывал вещи сервисом поверх socketio. Поскольку socketio является внешним по отношению к угловому $ apply, необходимо вызвать. благодаря – kitimenpolku

Смежные вопросы