这个程序有三个要素。首先,在服务中,我有:
$scope.loaded = MySvc.loaded;
$scope.loaded = false;
然后,在导入此服务的控制器中,我有一系列介绍性的东西。一旦控制器完成了其无关紧要的工作,我需要在指令中触发事件,所以在控制器中,当触发器准备就绪时,我
MySvc.loaded = true;
然后在指令中也导入了服务,我有,
$scope.loaded = MySvc.loaded;
$scope.$watch('loaded', function (newValue, oldValue) {
当loaded
初始化为'false'时,该指令触发,但当我将值更改为'true'时,没有任何反应。手表根本不会触发。为什么不?我该如何解决这个问题?
答案 0 :(得分:1)
正如我在评论中所说,你的范围可能会覆盖loaded
属性。
尝试使用角度事件来解决您的问题。
angular.module('test', [])
.controller 'MyController', ($scope, $timeout) ->
$timeout ->
$scope.$broadcast('READY')
, 2000
.directive 'myDirective', ->
scope: {}
template: '<span>{{ value }}</span>'
link: ($scope) ->
$scope.value = "I'm waiting to be ready..."
$scope.$on 'READY', ->
$scope.value = "I'm ready!!"
See this in action(CoffeeScript因为原型设计速度更快,但应该足够清晰)。
答案 1 :(得分:1)
这是一种很好的做事方式,我将其视为与承诺正交(这确实非常有用)。您的问题来自打破您使用作业创建的链接。而是尝试:
$scope.data = MySvc.data;
并附加于此,例如MySvc.data.loaded = false
。这样,data
变量永远不会被重新分配,因此控制器和服务之间的链接保持不变。
然后,您可以将data.loaded
或data
作为第3个选项传递给$watch
。
答案 2 :(得分:0)
你让这很复杂。使用承诺代替!他们很甜蜜。承诺保持其解决状态。
.factory('hello_world', function ($q, $timeout) {
var promise = $q.defer;
$timeout(function () {
promise.resolve('hello world');
}, 1000)
return promise.promise;
})
.controller('ctrl', function ($scope, hello_world) {
hello_world.then(function (response) {
console.log("I will only be ran when the async event resolves!");
console.log(response);
});
});
正如你所看到的,承诺要好得多,没有手表。没有奇怪的大门。更简单,更性感。 ;)