Двусторонняя привязка внутри директивы AngularJS работает с помощью ng-click, но не работает с window.onclick
Кто-нибудь может объяснить, почему, когда я нажимаю на свой элемент vm.random
обновляется внутри элемента, но когда я нажимаю только на окно vm.random, не обновляется на слое представления (но console.log
вывести новое значение), хотя оба события запускают одну и ту же функцию vm.update()
<!DOCTYPE html>
<html>
<head>
<script data-require="angular.js@1.5.9" data-semver="1.5.9" src="https://code.angularjs.org/1.5.8/angular.js"></script>
<script>
var app = angular.module('test', [])
.directive('testDir', function() {
return {
controllerAs: 'vm',
bindToController: true,
controller: function() {
var vm = this;
vm.random = Math.random();
window.onclick = function() {
vm.update();
};
vm.update = function() {
vm.random = Math.random();
console.log(vm.random);
};
},
template: '<div ng-click="vm.update()">Random number after click {{vm.random}}<input ng-model="vm.random"/></div>'
}
});
</script>
</head>
<body ng-app="test">
<h1>My directive</h1>
<test-dir></test-dir>
</body>
</html>
Что я должен изменить в этом фрагменте, чтобы иметь возможность обновлять vm.random после window.onlick и изменять vm.random?
1 ответ
Решение
Попробуй это:
window.onclick = funciton(){
$scope.$apply(function(){
vm.update();
});
}
Не забудьте ввести $scope в ваш контроллер
Даже если vm.random
не прямо на вашем $scope
Угловому еще нужно знать, что оно изменилось. призвание $scope.$apply
вручную позаботится об этом.
Причина, по которой это работает ng-click
является то, что угловые директивы автоматически заботятся о $scope.$apply
ИНГ