Наблюдение заводской переменной от контроллера
Упрощенный код:
var myApp = angular.module("myApp", []);
myApp.factory("mySrvc", function($window) {
var win = angular.element($window);
var foo = {
bar: 0
};
win.bind("click", function(){
foo.bar = foo.bar + 1;
alert("triggered! foo.bar="+foo.bar);
});
return {
foo: foo,
update: function() {
foo.bar = foo.bar + 1
}
};
});
myApp.controller("myCtrl", function(mySrvc) {
this.foo = mySrvc.foo;
mySrvc.update();
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<html>
<body ng-app="myApp">
<div ng-controller="myCtrl as ctrl">
{{ctrl.foo.bar}}
</div>
</body>
</html>
Теперь, когда я запускаю приложение, триггер обновления в контроллере успешно обновляет foo.bar
до 1, а наблюдатель из модели {{}} соответственно обновляет html. Но он обновляется на самой фабрике, щелкая мышью, что делает то же самое, что и функция обновления, изменение не появляется в HTML.
любые попытки с дополнительной областью видимости в контроллере были неудачными.
Почему это и как сделать Я наблюдаю за этой переменой?
1 ответ:
Как предложил @NewDev, вы можете использовать
$rootScope.$apply
или просто вы можете сделать это косвенно, добавив$timeout
, который будет запускать цикл дайджеста для вас.Код
win.bind("click", function() { $timeout(function() { foo.bar = foo.bar + 1; alert("triggered! foo.bar=" + foo.bar); }); });
Рабочий Плунжер