Angular: 自动更新对服务中定义的对象的范围引用?
Angular: Automatically update a scope reference to an object defined in a service?
我有一个 angular 应用程序 myApp
带有服务 myService
,包含一个对象 data
,该对象由两个控制器使用,parentCtrl
和 childCtrl
后者继承前者:https://jsfiddle.net/OleWahn/7ehLva10/2/
我通过 $scope.data = myService.getData()
在 parentCtrl
中引用了 data
,这也使得它可以从 childCtrl
.
访问
我在 myService
的闭包中定义了 data
,因此 $scope.data
只是对 data
.
的引用
因此,我可以在子控制器中更改 data
的属性,每个人 myService
、parentCrl
和 childCtrl
都会知道这些更改。到目前为止,还不错。
我的问题如下:如果我想覆盖整个 data
对象,我会在 childCtrl
.[=37= 中调用 myService
s 方法 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:
我在 myService
的 setData
方法中添加了一个 $broadcast
并在 parentCtrl
中捕获它并相应地更新 $scope.data
。
查看更新后的 fiddle https://jsfiddle.net/7ehLva10/7/ 了解详情。
使用函数
找到一个可能的解决方案 - 我可以将 $scope.data
定义为一个函数
返回myService.getData()
,即
$scope.data = function() {
return myService.getData();
};
此解决方案的缺点是在视图中我需要将 $scope.data
作为函数引用,即 {{data()}}
.
我有一个 angular 应用程序 myApp
带有服务 myService
,包含一个对象 data
,该对象由两个控制器使用,parentCtrl
和 childCtrl
后者继承前者:https://jsfiddle.net/OleWahn/7ehLva10/2/
我通过 $scope.data = myService.getData()
在 parentCtrl
中引用了 data
,这也使得它可以从 childCtrl
.
我在 myService
的闭包中定义了 data
,因此 $scope.data
只是对 data
.
因此,我可以在子控制器中更改 data
的属性,每个人 myService
、parentCrl
和 childCtrl
都会知道这些更改。到目前为止,还不错。
我的问题如下:如果我想覆盖整个 data
对象,我会在 childCtrl
.[=37= 中调用 myService
s 方法 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:
我在 myService
的 setData
方法中添加了一个 $broadcast
并在 parentCtrl
中捕获它并相应地更新 $scope.data
。
查看更新后的 fiddle https://jsfiddle.net/7ehLva10/7/ 了解详情。
使用函数
找到一个可能的解决方案 - 我可以将 $scope.data
定义为一个函数
返回myService.getData()
,即
$scope.data = function() {
return myService.getData();
};
此解决方案的缺点是在视图中我需要将 $scope.data
作为函数引用,即 {{data()}}
.