2014-12-12 2 views
3

Я пытаюсь использовать $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

Возможный дубликат [AngularJS: Basic $ часы не работает] (https://stackoverflow.com/questions/ 15664933/angularjs-basic-watch-not-working) – Pureferret

ответ

3

Это не срабатывает, потому что нет возможности Угловая знать, что вы изменили строку сразу после того, как вы ее объявили. В этом случае нет ничего, что запустило бы новый цикл дайджеста, поэтому $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 зарегистрирован в исполнении на же переваривать петли с string инициализации переменной.

+0

Ну, а также '= +' не '+ =', поэтому даже его тест был неправильным. – Sulthan

+0

@ Султан Да, спасибо. – dfsq

2

Я думаю, что проблема в том, что ваши часы не будет срабатывать, потому что изменения объема происходит в том же раунде объем обновляемой, чем создание часов. Вы инициализируете контроллер, чтобы все было применено до того, как угловой может проверить что-либо. Часы неактивны.

2

Ваши часы в порядке, вы просто ожидаете неправильного результата.

Функция $ watch предназначена для просмотра только после того, как контроллер сначала скомпилирован, после чего он работает.

Я обновил свою скрипку, так что вы можете увидеть его в действии:

http://jsfiddle.net/S9rV2/27/

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> 
Смежные вопросы