Disabling orderBy in AngularJS while editing the list

前端 未结 8 654
情歌与酒
情歌与酒 2021-01-07 23:06

After applying orderBy in my list of input boxes if i edit any field it starts sorting immediately and i loose focus. I tried to dug in the angular code and fou

8条回答
  •  失恋的感觉
    2021-01-08 00:03

    You can freeze the current ordering while you are editing. Say your html looks like this:

    
        
          {{item.name}}
        
    
    

    In your controller you write:

    var savedOrderBy, savedReverse;
    $scope.startEdit() = function() {
        $scope.items = $filter('orderBy')($scope.items, $scope.orderby, $scope.reverse);
    
        for (var i = 0; i < $scope.items.length; ++i) {
            if (i < 9999) { 
                $scope.items[i]['pos'] = ("000" + i).slice(-4); 
            }
        }
    
        savedOrderBy = $scope.orderBy;
        savedReverse = $scope.reverse;
        $scope.orderBy = 'pos';
        $scope.reverse = false;
    };
    

    Before the user starts editing, you first sort the current items in exactly the same order that they currently appear in the page. You do that by calling the orderBy $filter() with the current sorting parameters.

    Then you go over your - now sorted - items, and add an arbitrary property (here "pos") and set it to the current position. I zero-pad it so that position 0002 collates before 0011. Maybe that is not necessary, no idea.

    You normally want to remember the current ordering, here in the scope variables "savedOrder" and "savedReverse".

    And finally you tell angular to sort by that new property "pos" and voilà the table order is frozen, because that property simply does not change while editing.

    When you are done editing, you have to do the opposite. You restore the old ordering from the scope variables "savedOrder" and "savedReverse":

    $scope.endEdit = function() {
        $scope.orderBy = savedOrderBy;
        $scope.reverse = reverse;
    };
    

    If the order of the $scope.items array matters for you, you would also have to sort it again to its original ordering.

提交回复
热议问题