Javascript $watch listener被调用一次而表达式没有更改

Javascript $watch listener被调用一次而表达式没有更改,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,在我的控制器中,我有一个名为datetime的变量,它由计时器每秒更新一次。当天气变化时,我需要做一些工作,因此我注册了以下观察者: $scope.$watch(“datetime”日期:“MM/dd/yyyy”,函数(newDate,oldDate){ console.log(newDate==oldDate); },对); 但是在执行开始时,调用此侦听器时,newDate等于oldDate。有人知道会发生什么吗?更改日期时间的代码如下所示: var timeoutId; 函数startTi

在我的控制器中,我有一个名为
datetime
的变量,它由计时器每秒更新一次。当天气变化时,我需要做一些工作,因此我注册了以下观察者:

$scope.$watch(“datetime”日期:“MM/dd/yyyy”,函数(newDate,oldDate){
console.log(newDate==oldDate);
},对);
但是在执行开始时,调用此侦听器时,
newDate
等于
oldDate
。有人知道会发生什么吗?更改日期时间的代码如下所示:

var timeoutId;
函数startTimer(){
timeoutId=$timeout(勾号1000);
timeoutId.then(startTimer);
}
函数stopTimer(){
$timeout.cancel(timeoutId);
timeoutId=未定义;
}
函数tick(){
$scope.datetime=新日期();
}
$scope.init=函数(){
startTimer();
}

$scope.init()
ng init

$watch调用,在初始加载期间也会触发,请使用标志来避免它

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

$watch也在初始加载期间触发,请使用标志来避免它

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

仅当当前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);
(强调我的):

仅当当前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);

您是否检查了
datetime
的值?它很可能是
未定义的
…顺便说一句,出于性能原因,我将手表中的“|日期:'MM/dd/yyyy'”部分移动到函数中。现在,每当选中
$watch
时,转换都会发生。但实际上,您只需要在实际使用该值时进行转换。是否检查了
datetime
的值?它很可能是
未定义的
…顺便说一句,出于性能原因,我将手表中的“|日期:'MM/dd/yyyy'”部分移动到函数中。现在,每当选中
$watch
时,转换都会发生。但实际上,您只需要在实际使用该值时进行转换。