重新排序第一项上的Angular JS数组项?

时间:2015-03-04 18:58:10

标签: javascript arrays angularjs angularjs-ng-repeat

我假设我在这里有语法错误。

我的控制器中有一组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。

2 个答案:

答案 0 :(得分:0)

在你的moveUpChoice和moveDownChoice函数中你都有同样的错误。

arr.splice(currItem, currItem)[0]

应该是:

arr.splice(currItem, 1)[0]

答案 1 :(得分:0)

moveUpChoicemoveDownChoice的代码均不正确。两者都没有按照你期望的方式运作。

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

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

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