0

我有一个单一的服务定义如下:

 angular.module('myApp')
     .factory('myService', function ($resource, $q) {
         mySource = [];
         EndPoint = $resource('/my/api/endpoint', {});
         return({
              getSourceAsFunction: function(){
                  return(mySource);
              }
              ,getSourceAsValue: mySource,
              ,setSource: function(newSource){
                     mySource=newSource;
              }
              ,fetchSource: function(attributes){
                  request = $q.defer
                  EndPoint.get(attributes
                  ,function(success){
                          request.resolve(success.data);
                          //mySource['headersArray'] = success.data['headersArray'];
                          //mySource['footersArray'] = success.data['footersArray'];
                  },function(failure){
                          request.reject(failure);
                  });
                  request.promise
           });
      });

然后将该服务注入到多个控制器中,根据各种指令(其中一些具有隔离范围)。只有其中一个(截至目前)实际执行了获取(和结果集)操作,但用户可以通过点击交互重复执行获取操作。

其他控制器绑定如下:

      $scope.fooVar = myService.getSourceasValue;

或者

      $scope.fooVar = myService.getSourceAsFunction();

在这两种情况下,当服务中的值更改时,变量都不会自动更新。

$watch像这样设置:

       $scope.$watch('fooVar', function(newVal, oldVal){console.log('hi')}, true);

也永远不会触发(在这两种情况下)。

资源回调中的两行注释:

       //mySource['headersArray'] = success.data['headersArray'];
       //mySource['footersArray'] = success.data['footersArray'];

mySource 那时被实例化为{}. 这并没有解决问题。

是以前尝试并重用同一个对象的尝试。

我发现解决此限制的一种方法是像这样设置 $watch :

       $scope.$watch(function(){return(myService.getSourceAsFunction())}
                  , function(newVal, oldVal){console.log('hi'), true)};

但是,我发现这令人担忧,因为我不希望此功能在后台持续运行。(这是如何工作的?该功能多久运行一次?$digest触发多少次迭代?该解决方案的效率如何?)

我怎样才能解决这个问题?如果愿意,我如何“通过引用”绑定到服务变量?

可能有更好的方法吗?我尝试过事件,但是由于其中一些元素是同级元素,这会导致链过于复杂,其中一个孩子可能会$emit向上让一个联合父级的侦听器捕获一个事件并$broadcast退出。

还有哪些其他方法?

4

2 回答 2

2

您可以做的是,将您的服务设置在范围内,即 IE $scope.myService = myService,然后您可以直接从 HTML 访问它。

您还需要将 $scope 发送到您的服务,因此一旦它获取数据,您就可以运行 $scope.$apply()。

现在的问题是您在控制器初始化时设置它。控制器不会再次初始化,因此它永远不会更新。

$watch 只会在作用域被 $digest'd 后更新。在此处查看文档

于 2013-06-19T07:31:38.647 回答
1

这是我最好的猜测,为什么绑定不起作用。

最初您将数组设置为

mySource = [];

稍后当数据来自服务器时替换引用。

mySource = success.data;

相反,您可以尝试mySource.push更新初始数组中的数据的方法。

还只是想指出第一个 $watch 表达式应该将第一个参数作为变量名字符串而不是变量本身。

于 2013-06-19T06:26:51.970 回答