Подтвердить что ты не робот

Подписаться на изменение недвижимости в AngularJS

В knockoutJS можно подписаться на изменение свойства observable viewmodel, например:

myViewModel.personName.subscribe(function(newValue) {
    alert("The person new name is " + newValue);
});

В настоящее время я изучаю AngularJS, и мне было интересно, есть ли эквивалент этого в AngularJS? Я пробовал искать это, но не повезло.

4b9b3361

Ответ 1

Объект scope в AngularJS имеет специальный метод $watch для просмотра свойств области.

Он принимает обратный вызов, который получает новое и старое значение модели:

$scope.$watch('modelName', function(newValue, oldValue){
    // Do anything you like here
});

Обратный вызов выполняется при инициализации и каждый раз, когда модель изменяется. Поэтому может быть полезно добавить дополнительную проверку равенства:

$scope.$watch('modelName', function(newValue, oldValue){

    // Check if value has changes
    if(newValue === oldValue){
        return;
    }

    // Do anything you like here
});

Это позволяет вам "смотреть" вашу модель и выполнять некоторые действия, если это необходимо.

Еще одно замечание: если вы смотрите модель, содержащую объект, вы должны использовать дополнительный третий параметр, который сообщает AngularJS сравнивать оба значения по отношению к объекту, а не по ссылке (поскольку эта ссылка не будет меняться и, следовательно, не будет вызвать наблюдателя) следующим образом:

$scope.$watch('modelName', function(newValue, oldValue){
    // Do anything you like here
}, true); // Add extra 'true' parameter to check for object equality

Вы можете прочитать дополнительную документацию на странице AngularJS scope.

Надеюсь, что это поможет!

Ответ 2

Для вызовов API и асинхронных данных, инициируемых действиями пользователя или событиями приложения, вам лучше использовать

$rootScope.$broadcast('updateSearch', value);

непосредственно в обратном вызове служебной функции и использовании ее в ваших контроллерах, например:

$scope.$on('updateSearch', function(event,value) {
  $scope.search = value;
});