2014-10-27 103 views
1

我有一个模板,它从服务中获取数据。服务中的数据由指令更新。AngularJS:服务中的数据未更新

数据更新后,它不会在模板中更新。

// In my template 
{{service.get()}} 

// In my service 
.service('service', function($http){ 
    var _val = 5; 

    return{ 
     get:function(){ 
      return val; 
     }, 
     set:function(val){ 
      _val = val; 
     } 
    }; 
}); 

// In my directive 
var someDirective = angular.module('app.someDirective',[]); 

someDirective.directive('someDirective', ['service', function(service) { 
    return function(scope, element, attrs){ 
     $(element).on('scroll', function(event){ 
      service.set(15); 
     }); 
    }; 
}]); 

如果我在任何其他地方(如其他控制器)调用service.set(x)它可以100%正常工作。

也许有人知道,我做错了什么。 (非常感谢)

编辑 为了让多一点明确:

当页面负载, '5' 则显示(正确)。 但是,当值应该更新时,service.set()函数被正确调用(来自指令),但是模板中没有任何变化。

如果我调用service.set()任何其他,它的工作原理(值在模板中更新)。

回答

1

您的事件发生在摘要循环之外。简单的解决办法:

$timeout(function() { 
    service.set(15); 
}); 
+0

非常感谢。而已。作品100%完美,应该如何。但我真的不知道这里的问题是什么,以及$ timeout如何帮助。 – Tream 2014-10-27 14:56:21

+0

'$ timeout'调度要在下一个摘要循环中运行的代码。出于某种原因,您的事件发生在$ digest已经完成执行观察者时。所以你可以手动指示它再次运行。 – dfsq 2014-10-27 15:09:36

1

速战速决是包装设定在$timeout。事情没有得到更新的原因是因为角色不知道在$(element).on火灾时运行摘要。解决这个问题的另一种方法是使用$evalAsync