【问题标题】:ng-repeat does not seem to rebind ng-click on a re-renderingng-repeat 似乎没有重新绑定 ng-click 重新渲染
【发布时间】:2013-08-24 10:01:05
【问题描述】:

我有一个 ng-repeat 分配给表中的一行,如下所示。当用户在行中选择向下箭头时,将执行 moveDown 方法,该方法会重新排序列表(参见代码)。

当我查看 DOM 时,一切看起来都正确 - 行重新排序,ng-click 看到新分配的 seqNbr。

更好的解释:

最初第一行显示 data-ng-click='moveDown(0);'第二个数据-ng-click='moveDown(1);'

选择第一个后,第一排和第二排交换位置。 seqNbr 在对象中交换并重新排序列表,然后重新执行 ng-repeate。

现在 DOM 显示新的第一行有: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;
};

这种行为对我来说似乎不正确。结果是行来回切换,而不是上下移动。

【问题讨论】:

  • 这有点难追踪,有没有机会创造一个我们可以看看的小提琴?
  • 詹德森做得很好。我需要养成这个习惯。

标签: angularjs


【解决方案1】:

试试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]);
}; 

【讨论】:

  • 非常干净的解决方案 - 我喜欢。我想知道我的坏点是什么……
猜你喜欢
  • 2014-01-16
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 2014-02-02
  • 2013-06-24
  • 2018-04-15
相关资源
最近更新 更多