代码之家  ›  专栏  ›  技术社区  ›  nick.cook

AngularJS-ngRepeat排序更改数组长度

  •  0
  • nick.cook  · 技术社区  · 7 年前

    JSFIDLE(JSIDLE): http://jsfiddle.net/WdVDh/101/ .

    出于某种原因,当我更改ng重复列表的排序选项时,数组的长度会更改,并且在本地副本中,所有项都会被删除。

    我使用了过滤器/排序的组合,包括一个选项,通过链接到“showLeavers”$filter指令的复选框选择来过滤具有完整“leaveDate”属性的入/出员工。

    在“我的本地副本”中,如果未选中该复选框,并且选择了第二个或第三个排序选项,则会清除阵列,因此ng repeat列表中不会显示任何内容,但如果选中该复选框,或者选择了第一个或第四个排序选项,则列表会按其应有的方式显示。

    显然,代码中存在一个问题(我猜是filter指令),因为我可以演示类似于上面JSFiddle中的内容。


    HTML:

    <md-list-item ng-repeat="employee in employees | orderBy: sortEmployees | filter: searchEmployees | showLeavers:showLeaver">
    
    <md-input-container class="col-xs-12 col-sm-6 col-md-3">
    
        <label>Sort by</label>
    
        <md-select ng-model="allEmployees.sortEmployees">
    
            <md-option selected value="surname">Surname - A to Z</md-option>
    
            <md-option value="-surname">Surname - Z to A</md-option>
    
            <md-option value="forename">Forename - A to Z</md-option>
    
            <md-option value="-forename">Forename - Z to A</md-option>
    
        </md-select>
    
    </md-input-container>
    
    <md-checkbox ng-model="showLeaver">Show Leavers?</md-checkbox>
    

    过滤器:

    app.filter('showLeavers', function() {
    return function (employees, showLeaver) {
        var matches = [];
    
        angular.forEach(employees, function(value) {
            matches.push(value);
    
            if (value.leaveDate && !showLeaver) {
                matches.splice(value);
            }
            return matches;
        }
    })
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   KL_    7 年前

    您需要更改 .splice() ,需要提供元素的索引,以及要拼接的元素数量:

    matches.splice(matches.indexOf(value), 1);
    

    或者,你可以使用 .filter() 这样地:

    var matches = employees.filter(match => match.leaveDate.length <= 0 || showLeaver);