AngularJS-对象分配不起作用

AngularJS - Object assignment does not work

本文关键字:不起作用 分配 对象 AngularJS-      更新时间:2023-12-05

下午好,

我有一个关于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仍然指向同一个对象,因此它可以按预期工作。

对此进行一点扩展,如果我们在更详细的运行时语言中写出来:

控制器初始化时:

  1. 在对象$scope上创建一个名为testVar的属性
  2. 在堆{...}上创建一个对象,并将其引用分配给$scope.testVar

当您的功能运行时:

  1. 在作用域上获取对testVar的引用,并将其传递到函数updateData()中,局部变量名为param
  2. 执行testData()并在堆{...}上创建一个新对象
  3. 将对新对象的引用指定给局部变量param
  4. param现在指向堆上的新对象,而$scope.testVar仍然指向初始化时的同一对象

[只为子孙后代]

  1. updateData()执行完毕,param弹出堆栈
  2. 垃圾收集器发现没有任何东西指向testData()创建的对象,并通过释放它占用的内存将其从堆中删除

您只是在函数范围内更新param值,您需要通过$root.testData=getData()更新它;