AngularJS-使用服务和ng repeat时出现引用问题
我发现自己在与javascript中的“指针”作斗争。就好像我又进入了C++。我想知道你对我遇到的以下问题的看法 我的案例:我有一个AngularJS-使用服务和ng repeat时出现引用问题,angularjs,Angularjs,我发现自己在与javascript中的“指针”作斗争。就好像我又进入了C++。我想知道你对我遇到的以下问题的看法 我的案例:我有一个ng repeat,它覆盖了集合。单击某个集合元素时,我复制该元素,对其进行更改,并将数据发布/放置到服务器 如果服务器回复200个,则我将将这些更改应用于集合。集合包含对象,因此这意味着我使用的是引用而不是值 包含服务的模块定义: angular.module('dataModule', []) .service('DataService', funct
ng repeat
,它覆盖了集合
。单击某个集合元素时,我复制该元素,对其进行更改,并将数据发布/放置到服务器
如果服务器回复200个,则我将将这些更改应用于集合。集合包含对象,因此这意味着我使用的是引用而不是值
包含服务的模块定义:
angular.module('dataModule', [])
.service('DataService', function () {
this.collection = [{id:0, who: 'I'},
{id:1, who: 'YOU'},
{id:2, who: 'HE'},
{id:3, who: 'SHE'},
{id:4, who: 'IT'}];
})
这里是控制器:
.controller('listCtrl', function ($scope, $timeout, DataService) {
// Data used in view
$scope.collection = DataService.collection;
// Action trigger from the view
$scope.change = function(data, index){
// Get a copy
var copy = angular.copy(data);
// Apply changes over the copy
copy.id = data.id*100*index;
// Simulate POSTing/Updating data to server
console.log('Sending data to server...');
$timeout(function(){
// Response is 200
var response = 200;
// Assigning copy -> data
data = copy;
// The prev. assignment is not updating the collection
// Of course I could do $scope.collection[index] = copy;
// because this case is simple enough.
// Im finding myself having the service with methods find, edit, ...
// What's a better approach?
}, 2000)
}
});
正如我在评论中所说,我发现自己在服务中实现了查找、编辑或获取等功能。这就是要走的路吗
这是JSFIDLE,以防我无法正确解释。
数据
是对原始项的引用,但使用数据=复制
只是使数据无效,因此原始项永远不会更新
因此,要更新您需要执行的原始项
data.id = copy.id;
data.who = copy.who;
或
修改更新的代码
从我的角度来看,有两种方法可以在写入服务器后更新视图:
ng repeat
指令中的更新
在模板中使用data=copy服务器回调中的code>只是更新引用,而不是任何数据本身
相反,您可以直接更改集合本身:$scope.collection[index]=copy
这是一把有用的小提琴:谢谢你的回答。正如我在注释下的示例中提到的,我完全可以做$scopy.collection[index]=copy。这是处理像这样的简单数据的简单方法。。。但我不认为我应该这样做时,有2000个元素或更多的集合。。。若索引被破坏或不刷新,我可以更新一些完全不同的东西。。。因此,我发现自己使用lodash.find或下划线.find按id获取对象。还有比这更好的吗?还是这是“正确”的方法?@kitimenpolku,对我来说,这种方法很好。我会使用下划线。查找
甚至只查找内置的数组。过滤
以根据其ID查找一个对象,然后将该对象传递给数组。indexOf
以获取索引;然后我将使用该索引直接更新数组,如两个答案中所示。这可能是一种有效的方法。我不认为有任何一种“正确”的方法。@kitimenpolku是的,您应该向服务中添加方法来管理自己的数据,但这只是因为您可能在其他控制器中重用您的服务,并且您希望集中您的逻辑来执行此数据管理。
$scopy.collection[index] = copy