0

以下に示すように、テーブルの行に割り当てられた ng-repeat があります。ユーザーが行の下矢印を選択すると、メソッド moveDown が実行され、リストが並べ替えられます (コードを参照)。

DOM を見ると、すべてが正しく表示されます。行が並べ替えられ、ng-click で新しく割り当てられた seqNbr が表示されます。

より良い説明:

最初の行には、data-ng-click='moveDown(0);' が表示されます。2 番目の data-ng-click='moveDown(1);'

最初のものを選択した後、1 番目と 2 番目の行が交換されます。seqNbr がオブジェクトでスワップされ、リストが並べ替えられてから、ng-repeate が再実行されます。

これで、DOM は新しい最初の行に data-ng-click='moveDown(0);' があることを示しています。古い最初の行、現在は 2 番目の行には 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;
};

この振る舞いは私には正しくないようです。その結果、行が上下に移動するのではなく、行が前後に切り替わります。

4

1 に答える 1

2

この 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]);
}; 
于 2013-08-24T02:01:05.887 に答える