数组索引正在从视图中多次删除-AngularJS
一点背景知识:构建一个应用程序,将来自两个源(外部API和我自己的数据库)的数据拉入一个源。这需要从外部来源获取数据,并将其与每个实体的内部数据相结合 可以将实体数据的一部分放在一个子“div”中,另一部分放在另一个子“div”中。只有在关联上(通过ID),他们才能加入并只显示一个div。这是我的目标 问题 我正在尝试更新子控制器中数组的索引。事实上,数组的索引已经被删除了,尽管它已经发生了多次 我创建了一个plunker来演示这一点。如果你点击“用户一号”选项卡并多次点击“提交”,它会不断删除,我想不出还有什么原因 这是操作(actions.js)的主要逻辑,我将删除索引并将更新的实体分配给它:数组索引正在从视图中多次删除-AngularJS,angularjs,Angularjs,一点背景知识:构建一个应用程序,将来自两个源(外部API和我自己的数据库)的数据拉入一个源。这需要从外部来源获取数据,并将其与每个实体的内部数据相结合 可以将实体数据的一部分放在一个子“div”中,另一部分放在另一个子“div”中。只有在关联上(通过ID),他们才能加入并只显示一个div。这是我的目标 问题 我正在尝试更新子控制器中数组的索引。事实上,数组的索引已经被删除了,尽管它已经发生了多次 我创建了一个plunker来演示这一点。如果你点击“用户一号”选项卡并多次点击“提交”,它会不断删除
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现在在每个状态中显示正确的数组,但现在我正在考虑重构/测试的方法。感谢您的输入,它帮助您确定从何处开始查找!