重新排序 Angular JS 数组项在第一项上中断?

Reordering Angular JS array items breaking on first item?

我想我这里有语法错误。

我的控制器中有一组 4 个函数:添加新项、删除当前项、在数组中向后(向上)移动项、在数组中向前(向下)移动项。

他们都在工作除了当要向下移动的项目是第一个对象时

vm.maxChoices = 6;

vm.addNewChoice = function(arr) {
  var newItemNo = arr.length + 1;
  arr.push({
    'id': 'choice' + newItemNo
  });
};

vm.deleteChoice = function(arr, index) {
  arr.splice(index, index);
};

vm.moveUpChoice = function(arr, index) {
  var currItem = index;
  if (currItem>0) {
    arr.splice(currItem-1,0, arr.splice(currItem, currItem)[0]);
  }
};

vm.moveDownChoice = function(arr, index) {
  var currItem = index;
  var newPosition = index+1;
  if (currItem < arr.length) {
    arr.splice(newPosition,0, arr.splice(currItem, currItem)[0]);
  }
};

vm.showAddChoice = function(choice,arr) {
  return arr.length !== vm.maxChoices;
};

我对 moveDownChoice 做错了什么?

工作示例:http://plnkr.co/edit/WPdnmYbDSXC0LsbeMduM?p=preview

尝试创建 3 或 4 行,将数据放入字段中以查看其移动。您可以将 #2 移动到 #3 等,但是如果您尝试将第一个向下移动,它会创建一个新项目而不是移动到 #2。

在您的 moveUpChoice 和 moveDownChoice 函数中,您遇到了同样的错误。

arr.splice(currItem, currItem)[0]

应该是:

arr.splice(currItem, 1)[0]

moveUpChoicemoveDownChoice 的代码都不正确。两者都没有您期望的那样工作。

.splice()函数有3个参数。 positionnumToRemoveitemsToInsert。它 returns 已删除项目的数组。

所以在你的代码中,你告诉它去项目的位置,删除项目的项目数量,然后传递第一个要添加到新位置的项目。在第一行中,您将删除 0 个项目(基于 0 的数组),但在其他行中,您将删除比实际添加到新位置的数据更多的数据。向上箭头将使倒数第二个项目从数组中消失。

相反,尝试 arr.splice(newPosition,0, arr.splice(currItem, 1)[0]);