Javascript Angularjs手表没有触发
这个计划有三个要素。首先,在服务中,我有:Javascript Angularjs手表没有触发,javascript,angularjs,angularjs-directive,listener,angularjs-service,Javascript,Angularjs,Angularjs Directive,Listener,Angularjs Service,这个计划有三个要素。首先,在服务中,我有: $scope.loaded = MySvc.loaded; $scope.loaded = false; 然后,在导入此服务的控制器中,我有一系列的介绍性内容。一旦控制器完成了异步工作,我就需要在指令中触发事件,所以在控制器中,当触发器准备就绪时,我会这样做 MySvc.loaded = true; 然后在同样导入服务的指令中,我有 $scope.loaded = MySvc.loaded; $scope.$watch('loaded', func
$scope.loaded = MySvc.loaded;
$scope.loaded = false;
然后,在导入此服务的控制器中,我有一系列的介绍性内容。一旦控制器完成了异步工作,我就需要在指令中触发事件,所以在控制器中,当触发器准备就绪时,我会这样做
MySvc.loaded = true;
然后在同样导入服务的指令中,我有
$scope.loaded = MySvc.loaded;
$scope.$watch('loaded', function (newValue, oldValue) {
当
load
初始化为“false”时,指令会触发,但当我将值更改为“true”时,不会发生任何事情。这只表根本不会触发。为什么不呢?如何修复此问题?正如我在评论中所说的,您的作用域覆盖已加载的
属性时可能会遇到问题
尝试使用角度事件来解决您的问题
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!!"
角度模块('test',[])
.controller'MyController',($scope,$timeout)->
$timeout->
$scope.$broadcast('READY')
, 2000
.指令'myDirective',->
作用域:{}
模板:“{value}}”
链接:($scope)->
$scope.value=“我正在等待准备就绪…”
$scope.$on'READY',->
$scope.value=“我准备好了!!”
(CoffeeScript,因为它的原型制作速度更快,但应该足够清晰)。您正在使这变得复杂。改用承诺!!!它们很甜。承诺保持他们的决心
.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);
});
});
正如你所看到的,承诺要好得多,没有手表。没有奇怪的门。更简单,更性感 这是一种很好的做事方式,我认为它与承诺(确实非常有用)是正交的。你的问题来自于打破你与任务建立的联系。相反,请尝试:
$scope.data = MySvc.data;
并将其附加,例如MySvc.data.loaded=false
。这样,数据
变量就不会被重新分配,所以控制器和服务之间的链接保持不变
然后,您可以通过将true作为第三个选项传递给
$watch
来查看数据。加载的或将数据作为集合查看。首先,服务访问$scope
很奇怪。你能为这种情况发布完整的源代码吗?您的指令可能有自己的作用域,因此,控制器中的loaded
属性与指令作用域中的属性不同。尝试使用$scope.$broadcast
而不是bool标志来通知指令一切就绪。将值更改为true
后是否尝试使用$scope.$apply
?@JamesBrierley是。它导致了一个错误,因为摘要已经生效。@fracz服务有自己的作用域。该指令有自己的范围。控制器有自己的作用域。如您所见,该服务将其范围链接到服务的范围,以便观察更改。您的评论促使我意识到出了什么问题。我习惯用这种方式处理对象。。。不适用于简单的基本数据类型。当我处理对象时,我将指针的值传递给对象。对于简单的数据类型,它只传递值。我对广播费了相当长的时间有一个问题,但你的评论帮助我意识到了答案,待我把一切都搞定后,我会在后面发布。无论你最终得到什么,$watch
都不可能比$broadcast
快<代码>$watch
在每个摘要周期中进行评估。