2014-01-14 20 views
0

在我的控制人變更情況我有一個名爲datetime變量,它由計時器每秒鐘更新。我需要做一些工作的時候一天變化,所以我註冊了以下守望者:

$scope.$watch("datetime | date: 'MM/dd/yyyy'", function (newDate, oldDate) { 
    console.log(newDate === oldDate); 
}, true); 

但這監聽器被稱爲與newDate在開始執行時等於oldDate。有誰知道會發生什麼?改變datetime的代碼如下:

var timeoutId; 

function startTimer() { 
    timeoutId = $timeout(tick, 1000); 
    timeoutId.then(startTimer); 
} 

function stopTimer() { 
    $timeout.cancel(timeoutId); 
    timeoutId = undefined; 
} 

function tick() { 
    $scope.datetime = new Date(); 
} 

$scope.init = function() { 
    startTimer(); 
} 

$scope.init()被稱爲ng-init。初始加載期間

+0

你檢查什麼'datetime'的價值是什麼?這很可能是'undefined'... – callmekatootie

+1

順便說一下,出於性能方面的原因,我會將「| date:'MM/dd/yyyy'」部分移到函數內部。現在,每當'$ digest'發生轉換時 - 當$ watch被選中時。但是,只有在實際使用該值時才需要進行轉換。 – KayakDave

回答

4

the docs(重點煤礦):

監聽器只被調用時,從當前watchExpression值與以前調用watchExpression不相等(用的除外初始運行,見下文)。
[...]
觀察者與範圍,FN異步調用(通過$ evalAsync)來初始化觀察者聽衆註冊之後。在極少數情況下,這是不受歡迎的,因爲當watchExpression的結果沒有變化時,監聽者被稱爲。要在偵聽器fn中檢測到這種情況,可以比較newVal和oldVal。如果這兩個值相同(===),則由於初始化而調用偵聽器。

因此,改變你的$watch這樣的:

$scope.$watch("datetime | date: 'MM/dd/yyyy'", function (newDate, oldDate) { 
    if (newData !== oldDate) { 
     /* Value has changed: Do something useful */ 
     console.log(newDate === oldDate); 
    } 
}, true); 
1

$手錶引發的爲好,使用標誌,以避免它。

var first = true; 
$scope.$watch("datetime | date: 'MM/dd/yyyy'", function (newDate, oldDate) { 
    if(!first){ 
     console.log(newDate === oldDate); 
    } else { 
     first = false; 
    } 
}, true);