范围更新后视图未更新

时间:2013-10-28 01:01:52

标签: angularjs

这是我想要做的一个非常简单的例子

Athlete.save(athlete,function(result)
{
       $scope.athlete = result.athlete;
});

问题是$ scope.athlete变量在我的视图中不会更新。 为了让它更新,我必须这样做

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.athlete变量已经更新一样。 这个函数是从ng-click触发的,而不是一些jquery调用,据我所知,我是以角度方式进行的。

这是一个更简单的案例:http://plnkr.co/edit/lMCPbzqDOoa5K4GXGhCp

3 个答案:

答案 0 :(得分:1)

athlete = { fname: 'new fname', lname: 'new lname' };似乎正在创建一个名为athlete的新局部变量,而不是更新正在传递的变量。

处理此问题的更好方法是将$index的{​​{1}}传递给athlete函数并执行以下操作:

updateAthlete()

编辑:见plunkr工作:http://plnkr.co/edit/KPu3CSvGIl8l581r9A5o?p=preview

答案 1 :(得分:0)

看到这个答案:

https://stackoverflow.com/a/13104500/151084

  

基元按值传递,对象通过“副本传递”   参考”。

     

具体来说,当你传递一个对象(或数组)时,你是(无形的)   传递对该对象的引用,并且可以修改   该对象的内容,但如果您尝试覆盖该引用   它不会影响来电者所持参考的副本 - 即   引用本身是按值传递的。

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

答案 2 :(得分:0)

我从这里得到了帮助来解决这个问题:https://groups.google.com/forum/#!msg/angular/Ih06VLDH_JU/EtHLrGeMgUEJ

有两种方法,一种是已经提到的,以及使用索引来更新原始方式的方法。

第二种方法是使用angular.copy(源,目的地)