2015-02-10 3 views
4

Почему этот маленький угловой модуль не может обновить представление при изменении свойства ng-bind?Почему AngularJS ng-bind не обновляет вид

<body ng-app="bindExample"> 

<script> 
    angular.module('bindExample', []) 
    .controller('ExampleController', ['$scope', function($scope) { 
     var vm = this; 
     vm.name = 'Whirled'; 
     window.setInterval(function(){ vm.name = 'Jon';}, 5000); 
    }]); 
</script> 

<div ng-controller="ExampleController as vm"> 
    Hello <span ng-bind="vm.name"></span>! 
</div> 
</body> 

Я ожидаю, что через 5 секунд, то выход изменяется Hello Jon на это остается на Hello Whirled. Почему это? Нужно ли мне что-то делать?

ответ

11

использование $interval службы его

обертка для угловых Window.setInterval здесь является DOC

$interval(function(){ 
    vm.name = 'Jon'; 
}, 1000); 

не забудьте придать $interval как,

.controller('ExampleController', ['$scope', $interval, function($scope, $interval) { .... 

когда используя setInterval его вне угловой области, поэтому вам нужно использовать $interval здесь. $interval является выполнение против объема,


ИЛИ использовать $scope.$apply()

window.setInterval(function(){ 
    vm.name = 'Jon'; 
    $scope.$apply(); 
}, 5000); 

$ применять позволяет интегрировать изменения с циклом дайджеста

this answer would be helpful

+0

Спасибо. Если я вызову AJAX для чтения значения, а затем примените его к модели в моей ресурсной 'success' функции, мне нужно также использовать' $ apply'? – norbertpy

+1

Если вы используете угловую службу $ http для извлечения данных с сервера, вам не нужно вызывать $ scope.apply(); – neilhem

+1

НЕТ, если вы используете угловую службу '$ http' как #neilhem, упомянутую в последнем комментарии, но если вы используете как jquery ajax, вам нужно использовать' $ apply() 'там, чтобы сказать угловое, что есть что-то вне области и необходимо привязать к сфере действия. –

1

Да, использовать $ interval - это решение. Обычно вы меняете модель на атрибут метода $ scope. Таким образом, угловой будет зависеть от обновления представления. Если вы используете обратный вызов jQuery внутри директивы, вам придется использовать область действия. $ Применять так, чтобы угловые знали что-то событие