2013-04-24 37 views
24

Tôi hiện đang làm việc trên một ứng dụng khách dựa trên web twitter và do đó tôi đã sử dụng angular.js, node.js và socket.io. tôi đẩy tweets mới qua socket.io cho khách hàng của tôi, nơi một dịch vụ chờ các tweet mới. khi một tweet mới đến, dịch vụ gửi một sự kiện qua chương trình phát sóng $.angular.js: cập nhật mô hình không kích hoạt cập nhật chế độ xem

trong bộ điều khiển của tôi là trình xử lý sự kiện, trong đó các tweet đến được xử lý trong một chức năng riêng biệt. chức năng này chỉ đơn giản là đẩy tweet mới trong phạm vi tweet của tôi.

bây giờ, vấn đề của tôi ist, rằng chế độ xem của tôi không cập nhật nhưng tôi có thể thấy phạm vi phát triển của mình. có lẽ một trong các bạn có một ý tưởng, làm thế nào tôi có thể giải quyết vấn đề này?

thêm mã của tôi:

dịch vụ:

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

điều khiển:

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

toàn bộ dự án là ở đây: https://github.com/hochitom/node-twitter-client

+2

thử thêm $ phạm vi áp dụng $() trong addTweet và xem kết quả nếu xem là. cập nhật hoặc không –

Trả lời

46

Thêm bên dưới dòng mã trong addTweet và vấn đề sẽ được giải quyết

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

Cảm ơn bạn. $ scope. $ apply() đã giúp tôi. Chỉ tò mò - đây có phải là cách chính xác để cập nhật chế độ xem không? Có nghĩa là, không nên góc cạnh "tự quyết định" rằng phạm vi đã thay đổi? –

+3

Đó là một câu hỏi hay, http://jimhoskins.com/2012/12/17/angularjs-and-apply.html Jim Hoskins có một bản tóm tắt tuyệt vời về lý do tại sao 'áp dụng' trong trường hợp này là cần thiết. – KidA78

+0

Cảm ơn rất nhiều vì câu trả lời. $ scope. $ apply() đã làm việc cho tôi. Tôi đã sử dụng để thiết lập điều khiển tự động bằng cách sử dụng $ injector.invoke (...). Nhưng không thể nhận được các biến phạm vi $ được cập nhật trên chế độ xem. Các biến $ scope chỉ được cập nhật trên nhấn phím hoặc trên blur, nhưng khi tôi sử dụng $ scope. $ Apply(), các biến $ scope được cập nhật ngay lập tức trên view khi trang được nạp ban đầu. Cảm ơn rất nhiều. –

1

Tôi thích sử dụng $timeout (đừng quên tiêm nó để điều khiển của bạn) thay vì $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); 
     }); 
    }; 

    //... 

}); 
Các vấn đề liên quan