Angularjs 范围更新后视图未更新

Angularjs 范围更新后视图未更新,angularjs,Angularjs,下面是一个非常简单的例子,说明我正在尝试做什么 Athlete.save(athlete,function(result) { $scope.athlete = result.athlete; }); 问题是$scope.atternate变量在我的视图中没有更新。 为了让它更新,我必须这样做 Athlete.save(athlete,function(result) { $scope.athlete.fname = result.athlete.fname;

下面是一个非常简单的例子,说明我正在尝试做什么

Athlete.save(athlete,function(result)
{
       $scope.athlete = result.athlete;
});
问题是$scope.atternate变量在我的视图中没有更新。 为了让它更新,我必须这样做

Athlete.save(athlete,function(result)
{
       $scope.athlete.fname = result.athlete.fname;
       $scope.athlete.lname= result.athlete.lname;
       $scope.athlete.gender= result.athlete.gender;
       ....
});
这很快就会让人恼火。 在第一段代码中,angular似乎不知道我的$scope.atternate变量已被更新。 这个函数是通过ng点击触发的,而不是一些jquery调用,据我所知,我是以角度的方式来实现的


这是我做的一个更简单的例子:

运动员={fname:'newfname',lname:'newlname'}
似乎正在创建一个名为
atternate
的新局部变量,而不是更新正在传递的局部变量

处理此问题的更好方法是将
运动员
$index
传递给
updateAttlete()
函数,并执行以下操作:

$scope.updateAthlete = function (index) {
    $scope.athletes[index] = { 
      fname: 'new fname', 
      lname: 'new lname'
    };
};
编辑:参见工作日志:参见以下答案:

原语通过值传递,对象通过“对象的副本”传递 参考”

具体来说,当您传递对象(或数组)时,您是(不可见的) 传递对该对象的引用,可以修改 该对象的内容,但如果尝试覆盖引用 它不会影响调用方持有的引用副本,即。 引用本身是通过值传递的


这就解释了为什么plunker不更新。但是,您的内联代码示例(使用
$scope.atternate=result.atternate
)似乎应该可以工作。您能创建一个显示失败的示例吗?

我从这里得到了解决此问题的帮助:

有两种方法,一种是已经提到的,另一种是使用索引更新原始方法


第二种方法是使用angular.copy(source,destination)

您所展示的很好…在plunker或JSFIDLE中创建简单的演示,复制问题,尝试在
$scope.$apply()
中包装。。。如果摘要已在处理中但值得一试,则将抛出ERORR。我制作了一个更简单的示例,该示例也存在问题。好的…第二个示例在您更改单个属性时起作用…所以现在的问题是
atternate={fname:'new fname',lname:'new lname'}
似乎正在创建一个名为
atternate
的新局部变量,而不是更新正在传递的局部变量。