AngularJS: ajax调用后模板中的作用域没有更新
AngularJS: scope not updating in template after ajax call
我有这样一个对象数组:
$scope.posts = [
{
"name" : "name1",
"age" : 12
},
{
"name" : "name1",
"age" : 13
},
{
"name" : "name1",
"age" : 14
}
]
我在我的标记中重复这个数组,如下所示:
<div ng-repeat="post in posts">
<span>{{post.name}}</span>
<button ng-click="editPost(post)">Click!</button> <!-- passing post as argument here-->
</div>
控制器:
app.controller('PostController', function($scope, postFactory){
//array is present in controller, just not showing it here
$scope.editPost = function(post) {
postFactory.editPost(post).then(function(data) { //factory having an ajax call which gets new data to be assigned to 'post'
post = angular.copy(data.data)
console.log(post); //here new data is populated successfully
})
}
})
正如你所看到的,当'editPost'被调用时,新的post数据通过工厂从API中获取并分配给'post'(这是'editPost'函数的参数)。当我在分配新数据后的控制台日志"post"时,它会在控制台中显示新数据。然而,在我的标记中,仍然显示旧的数据。知道为什么标记没有更新吗?这是我的工厂:
app.factory('postFactory', function($http) {
return {
editPost : editPost
}
function editPost(post) {
return $http.post('<api>', post).success(function(response) {
return response.data;
})
}
})
编辑:我刚注意到一件事。当我改变:
post = angular.copy(data.data)
post.name = data.data.name;
帖子被更新。所以,我猜一个对象的质量分配没有得到更新,但当我更新一个单独的属性,它在模板中得到更新。
简短的回答:引用是"按值传递"给函数的。
长答:
当你将一个对象传递给一个函数时,函数将接收一个对该对象的引用的副本。当您覆盖该引用时,结果将仅在该函数的作用域中可见。
换句话说,当你在做:
post = angular.copy(data.data)
你只改变了post
(在editPost
里面)指向的东西。这将对外部世界/作用域没有影响(我说的作用域是指普通的JS函数作用域,而不是Angular的作用域)。
使代码工作的一种可能方法是将$index
值传递给editPost
,然后像这样修改$scope.posts
:
$scope.editPost = function(index) {
postFactory.editPost($scope.posts[index]).then(function(data) {
$scope.posts[index]= angular.copy(data.data)
})
}
编辑:既然我的解释不够清楚,我将尽量详细说明。
假设内存中有一个对象。我们称这个对象为objInMem
。该对象被vars
引用。从本质上讲,var
就像一个箭头,指向内存中的某个位置,即对象所在的位置。
someVar -> objInMem
当然,该引用的值(对象的"地址")也在内存中,可以通过将其分配给其他vars
来复制。
var otherVar = someVar; // someVar -> objInMem <- otherVar
当你调用一个接受一个对象的函数时,JS会复制你传递的引用的值,并把这个副本"给"给这个函数。
function f(obj) {...}
f(someVar); // someVar -> objInMem <- obj (inside function f)
当你尝试给obj赋值时(在f的内部),它只是改变了该引用的值,但原始引用将保持不变:
obj = someOtherThing; // obj -> someOtherThingInMem
// someVar -> objInMem (still the same)
我希望这能澄清问题。它有点过于简化,不包括简单的值(如数字),但它应该解释这种特定情况。
很可能angular没有意识到异步更新。
尝试像这样将它包装在超时中:
$timeout(function(){
post = angular.copy(data.data)
});
- 对父作用域的指令更新延迟了一步
- 当我更新另一个作用域变量时,作用域变量会自动更新
- AngularJS select with ng选项不更新父作用域中的引用对象属性
- 如何更新作为属性传入的作用域变量
- 从$http.get调用更新Angular作用域变量
- 隔离未更新指令中值的作用域
- Angular.js-从指令更新父作用域
- 修改作用域变量后,未更新作用域绑定
- 角度指令的父作用域未更新UI
- 正在更新UI路由器状态更改上的父作用域
- 更新侧自调用函数中的外部作用域对象
- AngularJS:如何在指令范围的对象发生变化时更新与控制器作用域相关联的控制器作用域
- 在 AngularJS 中执行作用域函数内的服务后,范围变量不会更新
- 离子选择不会更新依赖于作用域变量的功能
- 在 $scope.$watch 中更新时,独立作用域绑定不起作用
- 作用域变量未在$Scope中更新$看
- Angular.js-视图不't在resize事件中更改作用域变量时更新
- AngularJs:将一个值传递给打开ngDialog的指令,然后将更新的值反映回根作用域
- AngularJS:指令作用域更新&单击事件
- 如何在回调函数中从另一个作用域更新变量