我在ng-repeat中有一个很棒的项目列表,每个项目都有一个向上和向下按钮。我只想要向上按钮将列表项向上移动一个位置,向下按钮应将其向下移动一个位置。 问题是我得到一个错误说"无法读取属性' NaN'未定义的。" 似乎"位置"在第二行未定义。我该怎么做才能解决这个问题?
继承我正在使用的javascript(感谢Rishul Matta):
$scope.moveUp = function(ind, position) {
$scope.temp = $scope.list[position - 1];
$scope.list[position - 1] = $scope.list[position];
$scope.list[position = temp];
};
这是我的HTML:
<ul>
<li class="steps" ng-repeat="step in selectedWorkflow.Steps track by $index" ng-class="{'words' : step.Id != selectedStep.Id, 'selectedWords' : step.Id == selectedStep.Id}" ng-model="selectedWorkflow.Step" ng-click="selectStep(step, $index); toggleShow('showSubStep'); toggleShow('showEditBtn')">
{{step.Name}}
<input class="orderUpBtn" type="button" ng-click="moveUp($index, step)" style="z-index:50" value="U" />
<input class="orderDownBtn" type="button" style="z-index:50" value="D" />
</li>
</ul>
谢谢!
答案 0 :(得分:10)
感谢您发布此问题(+1)和答案jtrussell(+1)。我想与其他人分享我认为更可重用/模块化的答案(灵感来自odetocode.com post)。
对于HTML,jtrussell的代码是完美的,因为他修复/简化了一切。为了获得更好的用户体验,我刚为第一个/最后一个元素添加了ng-disabled。
<强> HTML:强>
<ul ng-controller="DemoCtrl as demo">
<li ng-repeat="item in demo.list">
{{item}}
<button class="move-up"
ng-click="listItemUp($index)"
ng-disabled="$first">
Move Up
</button>
<button class="move-down"
ng-click="listItemDown($index)"
ng-disabled="$last">
Move Down
</button>
</li>
</ul>
对于JS,请注意我认为更可重用的moveItem()函数。您也可以将此功能用于其他拖放交换功能。
控制器中的JS(在Angular 1.3.15上测试):
// Move list items up or down or swap
$scope.moveItem = function (origin, destination) {
var temp = $scope.list[destination];
$scope.list[destination] = $scope.list[origin];
$scope.list[origin] = temp;
};
// Move list item Up
$scope.listItemUp = function (itemIndex) {
$scope.moveItem(itemIndex, itemIndex - 1);
};
// Move list item Down
$scope.listItemDown = function (itemIndex) {
$scope.moveItem(itemIndex, itemIndex + 1);
};
我希望对那里的人有所帮助。谢谢SO社区!
答案 1 :(得分:3)
带有向上/向下按钮的简单列表非常简单,这里有一些粗略的通用代码。 ngRepeat
指令将遵循数组中项目的顺序,因此在视图中移动它只是将它们移动到数组本身的问题。
视图:
<ul ng-controller="DemoCtrl as demo">
<li ng-repeat="item in demo.list">
{{item}}
<button ng-click="demo.moveUp($index)">up</button>
<button ng-click="demo.moveDown($index)">down</button>
</li>
</ul>
控制器:
app.controller('DemoCtrl', function() {
this.list = list = ['one', 'two', 'three', 'four'];
this.moveUp = function(ix) {
if(ix > -1 && ix < list.length - 1) {
var tmp = list[ix+1];
list[ix+1] = list[ix];
list[ix] = tmp;
}
};
this.moveDown = function(ix) {
// similar...
};
});
您的代码中有一些奇怪的项目(例如,您写的是$scope.list[position] = temp;
时的意思$scope.list[position = temp];
,我的示例并不完美,但它应该让您走上正确的道路这是完整的工作演示:http://jsbin.com/vatekodeje,请注意,在我的代码中,我使用“up”来表示增加索引而不是页面顶部。
同样在您的控制器中,您使用position
作为索引(不清楚它应该是什么)并且在您的视图中使用{{1时,可能会引用一个名为$scope.list
的数组}}。也许你的selectedWorkflow.Steps
和$scope.list
是一样的?