2013-04-24 10 views
24

Aktualnie pracuję nad internetowym klientem Twitter i dlatego użyłem angular.js, node.js i socket.io. Przesyłam nowe tweety przez socket.io do mojego klienta, gdzie usługa czeka na nowe tweety. po nadejściu nowego tweeta usługa wysyła zdarzenie za pośrednictwem transmisji $.angular.js: aktualizacja modelu nie wyzwala aktualizacji widoku

w moim kontrolerze jest detektor zdarzeń, w którym przychodzące wiadomości są przetwarzane w oddzielnej funkcji. ta funkcja po prostu popycha nowy tweet w moim zasięgu tweet.

Mój problem polega na tym, że mój widok nie aktualizuje się, ale widzę, że mój zakres rośnie. może jeden z was ma pomysł, jak mogę to rozwiązać?

dodatkowo mój kod:

usługa:

(function() { 
    app.factory('Push', ['$rootScope', function ($rootScope) { 
     socket.on('new-tweet', function (msg) { 
      $rootScope.$broadcast('new-tweet', msg); 
     }); 
    }]); 
}()); 

kontroler:

(function() { 
    app.controller("StreamCtrl", function StreamCtrl ($scope, $rootScope, $http, Push) { 
     $scope.tweets = []; 

     $http 
      .get('/stream') 
      .then(function (res) { 
       $scope.tweets = res.data; 
      }); 

     $scope.addTweet = function (data) { 
      $scope.tweets.push(data); 
      console.log($scope.tweets); 
     }; 

     $rootScope.$on('new-tweet', function (event, data) { 
      if (!data.friends) { 
       $scope.addTweet(data); 
      } 
     }); 
    }); 
}()); 

cały projekt jest tutaj: https://github.com/hochitom/node-twitter-client

+2

spróbuj dodać $ $ zakres zastosowania() w addTweet i zobaczyć wyniki, jeśli widok jest. zaktualizowany lub nie –

Odpowiedz

46

Dodawanie poniżej linii kodu w addTweet a problem zostałby rozwiązany

$scope.addTweet = function (data) { 
      $scope.tweets.push(data); 
      $scope.$apply(); 
      console.log($scope.tweets); 
     }; 
+6

Dziękuję. $ scope. $ apply() pomógł mi. Po prostu ciekawy - czy to jest właściwy sposób na aktualizację widoku? Czyż nie powinno się "kątować", że zakres się zmienił? –

+3

To dobre pytanie, http://jimhoskins.com/2012/12/17/angularjs-and-apply.html Jim Hoskins ma świetne podsumowanie, dlaczego "zastosowanie" w tym przypadku jest potrzebne. – KidA78

+0

Wielkie dzięki za odpowiedź. $ scope. $ apply() pracował dla mnie. Kiedyś ustawiałem kontroler dynamicznie za pomocą $ injector.invoke (...). Ale nie udało się zaktualizować zmiennych w zakresie $ scope w widoku. Zmienne $ scope zostały zaktualizowane tylko przy naciśnięciu klawisza lub przy zamazaniu, ale gdy użyłem $ scope. $ Apply(), zmienne $ scope zostały natychmiast zaktualizowane w widoku, gdy strona została załadowana początkowo. Wielkie dzięki. –

1

wolę używać $timeout (nie zapomnij, aby wstrzyknąć go do kontrolera) zamiast $apply:

app.controller("StreamCtrl", function StreamCtrl ($scope, $timeout $rootScope, $http, Push) { 

    //... 

    $scope.addTweet = function (data) { 
     $timeout(function() { 
      $scope.tweets.push(data); 
      console.log($scope.tweets); 
     }); 
    }; 

    //... 

}); 
Powiązane problemy