Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度:是否自动更新服务中定义的对象的范围引用?_Javascript_Angularjs_Angularjs Scope_Angularjs Service - Fatal编程技术网

Javascript 角度:是否自动更新服务中定义的对象的范围引用?

Javascript 角度:是否自动更新服务中定义的对象的范围引用?,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都会

我有一个带有服务的angular app
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谢谢,这正是我想要的!我会在下面编辑我的答案,收集问题的所有解决方案,但这要归功于你