数组索引正在从视图中多次删除-AngularJS

数组索引正在从视图中多次删除-AngularJS,angularjs,Angularjs,一点背景知识:构建一个应用程序,将来自两个源(外部API和我自己的数据库)的数据拉入一个源。这需要从外部来源获取数据,并将其与每个实体的内部数据相结合 可以将实体数据的一部分放在一个子“div”中,另一部分放在另一个子“div”中。只有在关联上(通过ID),他们才能加入并只显示一个div。这是我的目标 问题 我正在尝试更新子控制器中数组的索引。事实上,数组的索引已经被删除了,尽管它已经发生了多次 我创建了一个plunker来演示这一点。如果你点击“用户一号”选项卡并多次点击“提交”,它会不断删除

一点背景知识:构建一个应用程序,将来自两个源(外部API和我自己的数据库)的数据拉入一个源。这需要从外部来源获取数据,并将其与每个实体的内部数据相结合

可以将实体数据的一部分放在一个子“div”中,另一部分放在另一个子“div”中。只有在关联上(通过ID),他们才能加入并只显示一个div。这是我的目标

问题

我正在尝试更新子控制器中数组的索引。事实上,数组的索引已经被删除了,尽管它已经发生了多次

我创建了一个plunker来演示这一点。如果你点击“用户一号”选项卡并多次点击“提交”,它会不断删除,我想不出还有什么原因

这是操作(actions.js)的主要逻辑,我将删除索引并将更新的实体分配给它:

setTimeout(function() {
    $scope.$apply(function() {
      user_tickets = $scope.$parent.$parent.$parent.tickets;
      for ( var status in user_tickets ) {
          for ( var i = 0; i < user_tickets[status].length; i++ ) {
              if ( user_tickets[status][i].id === 10 ) {
                  console.log('splicing');
                  console.log(user_tickets[status][i]);
                  user_tickets[status].splice(user_tickets[status].indexOf(i));
                  user_tickets[status][i] = { id: 10, name: 'Latest Issue', notes: "faking an update that adds a 'notes' key" };
              }
          }
      }
      $scope.$parent.tickets = user_tickets;
    });
  }, 1000);
setTimeout(函数(){
$scope.$apply(函数(){
user_tickets=$scope.$parent.$parent.$parent.tickets;
for(用户票据中的var状态){
对于(var i=0;i
拼接阵列的逻辑不会按预期的方式工作。由于要从阵列中删除对象,因此阵列本身会发生更改,并且下一个命令不会在同一阵列结构上运行

例如,如果您有一个由3个对象组成的数组
[1,2,3]
,并且希望删除
2
,并在其位置放置一条新记录,则当前代码将执行以下操作:

  • splice
    从阵列中删除
    2
    ,将阵列保留为
    [1,3]
  • array[1]
    现在指向对象
    3
    ,因此使用
    array[1]=4
    现在将给您留下一个
    [1,4]
    的数组(不是您期望的结果)

  • 相反,您可能应该在数组中循环并删除所有对象,然后使用所需的数据将新对象推送到数组的末尾。

    我所做的是在每个数组项上循环,使用我添加到数组对象的位置,或者根据我自己的逻辑删除它

    这似乎奏效了。现在只是玩弄副作用

    $timeout(function() {
    $scope.$apply(function() {
        var new_tickets = {};
        var ticket = resp.data.ticket;
        var user_tickets = $scope.$parent.$parent.$parent.tickets;
        for ( var status in user_tickets ) {
            var regex = new RegExp(status, 'gi');
            var tickets_by_status = user_tickets[status];
            console.log('started with length: ' + tickets_by_status.length);
            tickets_by_status.forEach(function(obj, index, array) {
                if ( ticket.id === obj.id ) {
                    console.log('got a match: obj='+obj.id + ' ticket:'+ticket.id);
                    console.log(obj.status);
                    if ( regex.test(obj.status) ) {
                        console.log('we matched status');
                        array[index] = ticket;
                    }
                    else {
                        console.log('ticket doesnt belong here anymore, splicing');
                        array.splice(index, 1);
                    }
                }
            });
            console.log('ended with length: ' + tickets_by_status.length);
            new_tickets[status] = {};
            new_tickets[status] = tickets_by_status;
        }
        $scope.$parent.tickets = new_tickets;
    });
    }, 2000);
    

    请将相关代码作为文本包含在问题中。外部链接不能代替问题本身中的代码。@Ryanyu完成了,很抱歉
    $timeout
    -不是
    设置timeout
    ,而是
    $apply()
    !!!!!!!!!我最感兴趣的是
    $scope.$parent.$parent.$parent.$parent
    的使用。这是一个可怕的构想。除此之外,这里的逻辑没有真正意义;当你想要更新一张票证时,你应该能够更新该记录;删除一条记录,然后尝试添加另一条具有相同id的记录是不对的。@Claies服务器端没有任何删除操作,我只是想从UI中删除它。删除它的原因是因为一个票证一次可以有两个条目,我想去掉这两个条目,只显示最新的条目。我会在尝试后更新您,感谢您指出这一点。嘿,克莱斯,我设法解决了这个问题。UI现在在每个状态中显示正确的数组,但现在我正在考虑重构/测试的方法。感谢您的输入,它帮助您确定从何处开始查找!