2013-04-24 18 views
24

मैं वर्तमान में वेब आधारित ट्विटर क्लाइंट पर काम कर रहा हूं और इसलिए मैंने angular.js, node.js और socket.io का उपयोग किया। मैं अपने क्लाइंट को socket.io के माध्यम से नई ट्वीट्स दबाता हूं, जहां एक सेवा नई ट्वीट्स के लिए प्रतीक्षा करती है। जब कोई नया ट्वीट आता है, तो सेवा $ प्रसारण के माध्यम से एक ईवेंट भेजती है।angular.js: मॉडल अपडेट दृश्य अपडेट को ट्रिगर नहीं करता है

मेरे नियंत्रक में एक ईवेंट श्रोता है, जहां आने वाली ट्वीट्स को एक अलग समारोह में संसाधित किया जा रहा है। यह फ़ंक्शन बस मेरे ट्वीट स्कोप में नए ट्वीट को धक्का देता है।

अब, मेरी समस्या यह है कि मेरा विचार अपडेट नहीं हो रहा है, लेकिन मैं अपना दायरा बढ़ रहा हूं। हो सकता है कि आप में से कोई एक विचार हो, मैं इसे कैसे हल कर सकता हूं?

अतिरिक्त मेरी कोड:

सेवा:

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

नियंत्रक:

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

पूरी परियोजना यहाँ है: https://github.com/hochitom/node-twitter-client

+2

जोड़ने का प्रयास करें $ गुंजाइश $ (addTweet में लागू) और परिणाम देखें दृश्य है यदि। अपडेट किया गया या –

उत्तर

46

addTweet और में कोड की रेखा से नीचे जोड़ा जा रहा है समस्या हल हो जाएगी

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

धन्यवाद। $ गुंजाइश। $ आवेदन() ने मेरी मदद की। बस उत्सुक - क्या यह दृश्य अपडेट करने का सही तरीका है? मतलब, क्या कोणीय "निर्णय" नहीं होना चाहिए कि दायरा बदल गया है? –

+3

यह एक अच्छा सवाल है, http://jimhoskins.com/2012/12/17/angularjs-and-apply.html जिम होस्किन्स का एक बड़ा सारांश है कि इस मामले में 'लागू' क्यों है, इसकी आवश्यकता है। – KidA78

+0

उत्तर के लिए बहुत बहुत धन्यवाद। $ गुंजाइश। $ आवेदन() मेरे लिए काम किया। मैं $ injector.invoke (...) का उपयोग कर गतिशील रूप से नियंत्रक सेट करता था। लेकिन दृश्य पर अपडेट किए गए $ स्कोप चर नहीं मिल सका। $ स्कोप वैरिएबल केवल कुंजी प्रेस या धुंध पर अपडेट किए गए थे, लेकिन जब मैंने $ स्कोप का उपयोग किया था। $ लागू(), पृष्ठ स्कोप वेरिएबल्स को तुरंत लोड होने पर दृश्य पर अपडेट किया गया था। बहुत बहुत धन्यवाद। –

1

मैं $apply के बजाय $timeout उपयोग करने के लिए (मत भूलना अपने नियंत्रक को इसकी सुई) पसंद करते हैं:

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

    //... 

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

    //... 

}); 
संबंधित मुद्दे