2013-03-27 14 views
17

मैं अंगुलरजेएस में एक घड़ी स्थापित करने का प्रयास कर रहा हूं और मैं स्पष्ट रूप से कुछ गलत कर रहा हूं, लेकिन मैं इसे काफी समझ नहीं सकता। घड़ी तत्काल पृष्ठ लोड पर गोलीबारी कर रही है, लेकिन जब मैं देखे गए मूल्य को बदलता हूं तो यह फायरिंग नहीं होता है। रिकॉर्ड के लिए, मैंने देखे गए चर को वापस करने के लिए एक अनाम फ़ंक्शन पर घड़ी भी सेट की है, लेकिन मेरे पास सटीक परिणाम हैं।

मैंने नियंत्रक में सबकुछ कर, नीचे एक न्यूनतम उदाहरण को कठोर कर दिया है। यदि इससे कोई फर्क पड़ता है, तो मेरा वास्तविक कोड निर्देशों में लगा हुआ है, लेकिन दोनों एक ही तरीके से विफल हो रहे हैं। मुझे लगता है कि कुछ मूलभूत होना है जो मुझे याद आ रही है, लेकिन मुझे बस यह नहीं दिख रहा है।

HTML:

<div ng-app="testApp"> 
    <div ng-controller="testCtrl"> 
    </div> 
</div> 

जे एस:

var app = angular.module('testApp', []); 

function testCtrl($scope) { 
    $scope.hello = 0; 

    var t = setTimeout(function() { 
     $scope.hello++; 
     console.log($scope.hello); 
    }, 5000); 

    $scope.$watch('hello', function() { console.log('watch!'); }); 
} 

टाइमआउट काम करता है, hello वेतन वृद्धि, लेकिन घड़ी आग नहीं करता है।

डेमो http://jsfiddle.net/pvYSu/

उत्तर

40

पर यह क्योंकि आप कोणीय जानने के बिना मान को अद्यतन है।

आपको setTimeout के बजाय $timeout सेवा का उपयोग करना चाहिए, और आपको उस समस्या के बारे में चिंता करने की आवश्यकता नहीं होगी।

function testCtrl($scope, $timeout) { 
    $scope.hello = 0; 

    var t = $timeout(function() { 
     $scope.hello++; 
     console.log($scope.hello); 
    }, 5000); 

    $scope.$watch('hello', function() { console.log('watch!'); }); 
} 

या आप $ स्कोप कॉल कर सकते हैं। $ आवेदन(); आवश्यक होने पर मानों को फिर से जांचने और घड़ियों को कॉल करने के लिए कोणीय को मजबूर करने के लिए।

var t = setTimeout(function() { 
    $scope.hello++; 
    console.log($scope.hello); 
    $scope.$apply(); 
}, 5000); 
+7

'setTimeout' के उपयोग सिर्फ उदाहरण के लिए था बिना उपयोग कर सकते हैं। '$ लागू करें() 'असली दुनिया में जो खो रहा था वह था। धन्यवाद! –

0

यह भी हो सकता है क्योंकि div नियंत्रक के साथ पंजीकृत नहीं है। अपने div करने के लिए एक नियंत्रक जोड़े के रूप में निम्नानुसार और अपनी घड़ी काम करना चाहिए:

<div ng-controller="myController"> 
0

आप $ अंतराल और $ टाइमआउट

$scope.$watch(function() { 
      return variableToWatch; 
     }, function(newVal, oldVal) { 
      if (newVal !== oldVal) { 
       //custom logic goes here...... 
      } 
     }, true); 
संबंधित मुद्दे