我有一个ng-repeat分配给表格中的一行,如下所示。当用户选择行中的向下箭头时,将执行方法moveDown,这会重新排序列表(请参阅代码)。
当我查看DOM时,一切看起来都正确 - 行被重新排序,ng-click看到新分配的seqNbr。
更好的解释:
最初第一行显示data-ng-click ='moveDown(0);' second data-ng-click ='moveDown(1);'
选择第一个后,第一和第二行交易位置。 seqNbr在对象中交换,列表重新排序,然后重新执行ng-repeate。
现在DOM显示NEW第一行有:data-ng-click ='moveDown(0);'旧的第一行,现在是第二行,有data-ng-click ='moveDown(1);'
但是,如果我选择新的第一行,执行的是moveDown(1)(与该行关联的旧方法)。它好像DOM已更新,但不是方法绑定。
HTML:
<tr class='evidencerow' data-ng-repeat="e in data.evidence">
<td><div class='assertion webdiv' style='height:4em;'
data-ng-dblclick='openReference(e);'>
<span data-ng-bind-html-unsafe='e.assertion'></span>
</div>
</td>
<td>
<img src='img/UpArrow16x16.png' data-ng-hide='$first'
data-ng-click='moveUp({{e.seqNbr}});' style='width:32px;'>
<img src='img/DownArrow16x16.png' data-ng-hide='$last'
data-ng-click='moveDown({{e.seqNbr}});' style='width:32px;'>
</td>
</tr>
控制器代码:
$scope.moveUp = function(seq) {
var recs = $scope.data.evidence.slice(0);
recs[seq].seqNbr = seq - 1;
if (_ev.notEmpty(recs[seq - 1])) {
var s2 = seq - 1;
recs[s2].seqNbr = seq;
}
recs.sort(_ev.compareSeqNbr);
$scope.data.evidence = recs;
};
$scope.moveDown = function(seq) {
var recs = $scope.data.evidence.slice(0);
recs[seq].seqNbr = seq + 1;
if (_ev.notEmpty(recs[seq + 1])) {
var s2 = seq +1;
recs[s2].seqNbr = seq;
}
recs.sort(_ev.compareSeqNbr);
$scope.data.evidence = recs;
};
这种行为对我来说似乎不对。结果是代替行上下移动,它们来回切换。
答案 0 :(得分:2)
试试this jsFiddle。我认为它能满足您的需求。
我稍微修改了您的moveUp()
和moveDown()
函数,他们现在使用完整的“证据”对象,而不只是一个数字。
$scope.moveUp = function(e) {
var idx = $scope.data.evidence.indexOf(e);
var removed = $scope.data.evidence.splice(idx, 1);
$scope.data.evidence.splice(idx - 1, 0, removed[0]);
};
$scope.moveDown = function(e) {
var idx = $scope.data.evidence.indexOf(e);
var removed = $scope.data.evidence.splice(idx, 1);
$scope.data.evidence.splice(idx + 1, 0, removed[0]);
};