我正在尝试使用$watch
,但是在我预期时却没有触发。
为什么在$scope.string
更改时,以下代码无法触发?
$scope.string = 'Hello.';
$scope.timesChanged = 0;
$scope.$watch('string', function (newValue) {
$scope.timesChanged =+ 1;
});
$scope.string = 'How are you';
$scope.string = 'doing today?';
这里是fiddle
答案 0 :(得分:3)
它没有触发,因为Angular无法知道您在声明后立即更改了字符串。在这种情况下,没有什么可以触发新的摘要循环,因此$watch
不会被激发。基本上这和你写的一样
$scope.string = 'Hello.';
$scope.string = 'How are you';
$scope.string = 'doing today?';
$scope.timesChanged = 0;
$scope.$watch('string', function (newValue) {
$scope.timesChanged =+ 1; // you probably want += 1 here.
});
Watcher在{strong>相同摘要循环执行中注册,string
变量初始化。
答案 1 :(得分:2)
我认为问题在于您的手表不会被触发,因为范围的更改发生在与手表创建相同的范围更新中。您正在初始化控制器,因此在角度可以检查任何内容之前应用所有内容。手表不活动。
答案 2 :(得分:2)
你的$ watch很好,你只是期望错误的结果。
$ watch功能设置为仅在首次编译控制器后才能观察,之后才能正常工作。
我更新了你的小提琴,以便你可以看到它的实际效果:
var app = angular.module('myApp', []);
function MyCtrl($scope) {
$scope.string = 'Hello.';
$scope.timesChanged = 0;
$scope.$watch('string', function (newValue) {
$scope.timesChanged++;
});
$scope.string = 'How are you';
$scope.string = 'doing today?';
}
<div ng-controller="MyCtrl">{{ timesChanged }}
<br/>
<input type="text" ng-model="string"></input>
</div>