Angular:自动更新对服务中定义的对象的范围引用?

时间:2016-03-02 14:30:38

标签: javascript angularjs angularjs-scope angularjs-service

我有一个带有服务myApp的有角度的应用myService,其中包含两个控制器使用的对象dataparentCtrlchildCtrl后者继承自前者:https://jsfiddle.net/OleWahn/7ehLva10/2/

我在data parentCtrl之内引用$scope.data = myService.getData()childCtrl也可以data访问{。}}。

我在myService的结尾处定义了$scope.data,因此data只是对data的引用。

因此,我可以在子控制器中更改myService的属性,每个人parentCrlchildCtrldata都会知道这些更改。到目前为止,非常好。

我的问题如下:如果我要覆盖整个myService对象,我会在setData中调用childCtrl方法data

同样,我希望每个人都收到$scope.data已更改的通知。 myService但仍然指向最初定义的对象,data #include "prussdrv.h" #include <pruss_intc_mapping.h> prussdrv_exec_program (PRU_NUM, "./PRU_example.bin"); sleep(1); prussdrv_pru_send_event(ARM_PRU0_INTERRUPT); //wait till it will be completed prussdrv_pru_wait_event (PRU_EVTOUT_0); prussdrv_pru_clear_event (PRU_EVTOUT_0, PRU0_ARM_INTERRUPT ); /* Disable PRU and close memory mapping*/ prussdrv_pru_disable(PRU_NUM); prussdrv_exit (); 已更改通知,这将成为我的最后一个问题:

有没有办法自动将范围引用更新为服务中定义的对象?

2 个答案:

答案 0 :(得分:2)

使用目标参数angular.copy

  

angular.copy 1

     

用法

angular.copy(source, [destination]);
     
      
  • 如果提供了目标,则会删除其所有元素(对于数组)或属性(对象),然后将源中的所有元素/属性复制到该目标。
  •   

因此,不是替换范围引用,而是保留引用,清空它,并用新内容填充它。

function setData(newData) {
    //DO this
    angular.copy(newData, data);
    //Instead of this
    //data = newData;   
}

答案 1 :(得分:1)

解决问题的两种不同方法:

$广播

此解决方案可归功于@ doctor_Nick42:

我在$broadcast的{​​{1}}方法中添加了setData,并相应地在myService更新parentCtrl中将其捕获。

查看更新的小提琴https://jsfiddle.net/7ehLva10/7/了解详情。

使用功能

找到一个可能的解决方案 - 我可以将$scope.data定义为一个函数 返回$scope.data,即

myService.getData()

此解决方案的缺点是在视图中我需要将$scope.data = function() { return myService.getData(); }; 称为函数,即$scope.data