我正在尝试在AngularJS中设置手表,但我显然做错了,但我不太清楚。手表在立即加载页面时触发,但是当我更改观察值时,它不会触发。为了记录起见,我还在匿名函数上设置了监视以返回监视的变量,但结果完全相同。

我在下面整理了一个最小的示例,在控制器中进行了所有操作。如果有所不同,我的实际代码将挂接到指令中,但是两者都以相同的方式失败。我觉得我必须缺少一些基本的东西,但我只是看不到。

HTML:

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


JS:

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/上的演示

最佳答案

这是因为您在不知道Angular的情况下更新了值。

您应该使用$timeout服务而不是setTimeout,并且您不必担心该问题。

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!'); });
}


或者,您可以调用$ scope。$ apply();。强制角度重新检查值并在必要时致电手表。

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

09-29 20:30