Angularjs手表没有触发

时间:2015-08-19 21:28:27

标签: javascript angularjs angularjs-directive listener angularjs-service

这个程序有三个要素。首先,在服务中,我有:

$scope.loaded = MySvc.loaded;
$scope.loaded = false;

然后,在导入此服务的控制器中,我有一系列介绍性的东西。一旦控制器完成了其无关紧要的工作,我需要在指令中触发事件,所以在控制器中,当触发器准备就绪时,我

MySvc.loaded = true;

然后在指令中也导入了服务,我有,

$scope.loaded = MySvc.loaded;
$scope.$watch('loaded', function (newValue, oldValue) {

loaded初始化为'false'时,该指令触发,但当我将值更改为'true'时,没有任何反应。手表根本不会触发。为什么不?我该如何解决这个问题?

3 个答案:

答案 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.loadeddata作为第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);
   });
 });

正如你所看到的,承诺要好得多,没有手表。没有奇怪的大门。更简单,更性感。 ;)