Javascript 角度:是否自动更新服务中定义的对象的范围引用?
我有一个带有服务的angular appJavascript 角度:是否自动更新服务中定义的对象的范围引用?,javascript,angularjs,angularjs-scope,angularjs-service,Javascript,Angularjs,Angularjs Scope,Angularjs Service,我有一个带有服务的angular appmyApp,其中包含一个对象数据,由两个控制器使用,parentCtrl和childCtrl后者继承自前者: 我通过$scope.data=myService.getData()引用parentCtrl中的data,这也使得它可以从childCtrl访问 我在myService的结尾中定义了data,因此$scope.data只是对data的引用 因此,我可以在子控制器中更改数据的属性,每个人,myService,parentCrl和childCtrl都会
myApp
,其中包含一个对象数据
,由两个控制器使用,parentCtrl
和childCtrl
后者继承自前者:
我通过$scope.data=myService.getData()
引用parentCtrl
中的data
,这也使得它可以从childCtrl
访问
我在myService
的结尾中定义了data
,因此$scope.data
只是对data
的引用
因此,我可以在子控制器中更改数据的属性,每个人,myService
,parentCrl
和childCtrl
都会知道这些更改。到目前为止,一切顺利
我的问题如下:如果我想覆盖整个数据
对象,我调用myService
s方法setData
在childCtrl
中
再次提醒大家,数据
已更改。
$scope.data
但是仍然指向最初定义的对象,并且不会被myService
通知data
已更改,这将是我的最后一个问题:
有没有办法自动更新服务中定义的对象的作用域引用?使用angular.copy的destination参数
复印件
用法
angular.copy(source, [destination]);
- 如果提供了目标,将删除其所有元素(用于数组)或属性(用于对象),然后将源中的所有元素/属性复制到目标
因此,与其替换范围引用,不如保留引用,清空它,并用新内容填充它
function setData(newData) {
//DO this
angular.copy(newData, data);
//Instead of this
//data = newData;
}
解决该问题的两种不同方法:
$broadcast
此解决方案归功于@doctor_Nick42:
我将$broadcast
添加到myService
的setData
方法中,并在parentCtrl
更新$scope.data
中相应地捕获它
查看更新的小提琴以了解详细信息
使用函数
找到了一个可能的解决方案-我可以将$scope.data
定义为一个函数
返回myService.getData()
,即
$scope.data = function() {
return myService.getData();
};
此解决方案的缺点是,在视图中,我需要将$scope.data
作为函数引用,即{{{data()}}
这比我想象的要好,非常感谢!但它并没有回答我最初的问题,我想我并没有把它说得很好。如果我想更改引用而不是交换对象的内容,该怎么办?例如,我有一个数组,其中包含几个类似数据的对象,我希望$scope.data
指向其中任何一个对象。现在,在childCtrl
中,我想通过myService
的setter来更改该指针-如何使$scope.data
意识到该更改?@razzamatazz我不确定,如果这是您需要的,但也许您应该查看$broadcast
。使用此功能,您可以从服务“通知”控制器您的数据更改。我知道过度使用$broadcast
不是一个好的做法,但也许它可以帮助你。@doctor_Nick42谢谢,这正是我想要的!我会在下面编辑我的答案,收集问题的所有解决方案,但这要归功于你