AngularJS-使用服务和ng repeat时出现引用问题

AngularJS-使用服务和ng repeat时出现引用问题,angularjs,Angularjs,我发现自己在与javascript中的“指针”作斗争。就好像我又进入了C++。我想知道你对我遇到的以下问题的看法 我的案例:我有一个ng repeat,它覆盖了集合。单击某个集合元素时,我复制该元素,对其进行更改,并将数据发布/放置到服务器 如果服务器回复200个,则我将将这些更改应用于集合。集合包含对象,因此这意味着我使用的是引用而不是值 包含服务的模块定义: angular.module('dataModule', []) .service('DataService', funct

我发现自己在与javascript中的“指针”作斗争。就好像我又进入了C++。我想知道你对我遇到的以下问题的看法

我的案例:我有一个
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
    指令中的更新 在模板中使用
  • 正如您所提到的,您在本地执行相同的转换。这需要找到数组的正确索引,并将旧对象替换为已编辑的对象。这就是我喜欢设置自己的应用程序的方式,其实并不难。以下是方法:
  • <>我可以看到,你真的在想这个JavaScript替换,就像它是C++一样。这里,您的
    data=copy只是更新引用,而不是任何数据本身

    相反,您可以直接更改集合本身:
    $scope.collection[index]=copy


    这是一把有用的小提琴:

    谢谢你的回答。正如我在注释下的示例中提到的,我完全可以做$scopy.collection[index]=copy。这是处理像这样的简单数据的简单方法。。。但我不认为我应该这样做时,有2000个元素或更多的集合。。。若索引被破坏或不刷新,我可以更新一些完全不同的东西。。。因此,我发现自己使用lodash.find或下划线.find按id获取对象。还有比这更好的吗?还是这是“正确”的方法?@kitimenpolku,对我来说,这种方法很好。我会使用
    下划线。查找
    甚至只查找内置的
    数组。过滤
    以根据其ID查找一个对象,然后将该对象传递给
    数组。indexOf
    以获取索引;然后我将使用该索引直接更新数组,如两个答案中所示。这可能是一种有效的方法。我不认为有任何一种“正确”的方法。@kitimenpolku是的,您应该向服务中添加方法来管理自己的数据,但这只是因为您可能在其他控制器中重用您的服务,并且您希望集中您的逻辑来执行此数据管理。
    $scopy.collection[index] = copy