下午好,
我有一个关于AngularJS的问题:
在我的html模板中有一个按钮:
<button class="btn btn-default" ng-click="updateData(testVar)">do it</button>
如果单击该按钮,将触发一个函数,该函数将更新传递的$scope变量。
该变量具有以下结构:
$scope.testVar =
{
id: 1,
name: 'angular',
obj:
{
obj1: 'object1',
obj2: 'object2'
}
};
这是我更新$scope变量的函数:
$scope.updateData = function(param)
{
param = getData();
}
function getData()
{
return {
id: 2,
name: 'test',
obj:
{
obj1: 'object3',
obj2: 'object4'
}
};
}
然而,我的问题是,在函数完成后,$scope变量仍然具有与以前相同的值。
如果我只更新变量的一个属性,它会起作用:
param.name = getData().name;
我不明白这是怎么回事。如果有人能为我解释这个过程,我会很高兴。
您将用新对象替换param
的引用,而不是分配给$scope.testVar
。改为:
$scope.updateData = function() {
$scope.testVar = getData();
};
这是因为您只是简单地将一个引用交换为另一个引用。$scope
指向的原始引用是旧对象。
更新单个属性时,param
和$scope.testVar
仍然指向同一个对象,因此它可以按预期工作。
对此进行一点扩展,如果我们在更详细的运行时语言中写出来:
控制器初始化时:
- 在对象
$scope
上创建一个名为testVar
的属性 - 在堆
{...}
上创建一个对象,并将其引用分配给$scope.testVar
当您的功能运行时:
- 在作用域上获取对
testVar
的引用,并将其传递到函数updateData()
中,局部变量名为param
- 执行
testData()
并在堆{...}
上创建一个新对象 - 将对新对象的引用指定给局部变量
param
param
现在指向堆上的新对象,而$scope.testVar
仍然指向初始化时的同一对象
[只为子孙后代]
updateData()
执行完毕,param
弹出堆栈- 垃圾收集器发现没有任何东西指向
testData()
创建的对象,并通过释放它占用的内存将其从堆中删除
您只是在函数范围内更新param值,您需要通过$root.testData=getData()更新它;