Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angularjs手表没有触发_Javascript_Angularjs_Angularjs Directive_Listener_Angularjs Service - Fatal编程技术网

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
在每个摘要周期中进行评估。