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

Angular: Automatically update a scope reference to an object defined in a service?

我有一个 angular 应用程序 myApp 带有服务 myService,包含一个对象 data,该对象由两个控制器使用,parentCtrlchildCtrl 后者继承前者:https://jsfiddle.net/OleWahn/7ehLva10/2/

我通过 $scope.data = myService.getData()parentCtrl 中引用了 data,这也使得它可以从 childCtrl.

访问

我在 myService 的闭包中定义了 data,因此 $scope.data 只是对 data.

的引用

因此,我可以在子控制器中更改 data 的属性,每个人 myServiceparentCrlchildCtrl 都会知道这些更改。到目前为止,还不错。

我的问题如下:如果我想覆盖整个 data 对象,我会在 childCtrl.[=37= 中调用 myServices 方法 setData ]

再次提醒大家,data 已更改。 然而 $scope.data 仍然指向最初定义的对象,myService 不会通知 data 已更改,这将作为我的最后一个问题:

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

使用 angular.copy

的目标参数

angular.copy1

Usage

angular.copy(source, [destination]);
  • If a destination is provided, all of its elements (for arrays) or properties (for objects) are deleted and then all elements/properties from the source are copied to it.

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

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

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

$广播

此解决方案归功于@doctor_Nick42:

我在 myServicesetData 方法中添加了一个 $broadcast 并在 parentCtrl 中捕获它并相应地更新 $scope.data

查看更新后的 fiddle https://jsfiddle.net/7ehLva10/7/ 了解详情。

使用函数

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

$scope.data = function() {
    return myService.getData();
};

此解决方案的缺点是在视图中我需要将 $scope.data 作为函数引用,即 {{data()}}.