【问题标题】:AngularJS | orderBy filter not updated dynamicallyAngularJS | orderBy 过滤器未动态更新
【发布时间】:2012-12-23 15:02:29
【问题描述】:

我在使用 AngularJS 中的 orderBy 过滤器时遇到问题。这是我的设置:

<li ng-repeat="item in listItems.data | orderBy:order">
    <a ng-click="getRelated(item._id)">{{ item.title }}</a>
</li>

部分控制器:

$scope.order = 'year';

$scope.listItems = $http.post($scope.url, {'filterType': 'abc', 'letter': $scope.params.letter});

$scope.setOrder = function(order) {
    $scope.order = order;
}

最后是我想用来排序数据的“开关”

    <span class="sort--title">Sort by</span>
    <a ng-class="{true:'selected', false:''}[order=='title']" href="" ng-click="setOrder('title')" class="sort--attribute">Title</a>
    <a ng-class="{true:'selected', false:''}[order=='year']" href="" ng-click="setOrder('year')" class="sort--attribute">Year</a>
    <a ng-class="{true:'selected', false:''}[order=='length']" href="" ng-click="setOrder('length')" class="sort--attribute">Length</a>
    <a ng-class="{true:'selected', false:''}[order=='date_added']" href="" ng-click="setOrder('date_added')" class="sort--attribute">Date Added</a>

当我点击按钮时,列表没有被重新排序。 当我手动更改初始 $scope.order 值时,列表按属性排序。 ng-class 也已正确更新。我显然错过了什么!

【问题讨论】:

  • 你能用 jsFiddle 解决你的问题吗?我看不到你的 post 函数返回的数据是什么样的。
  • 我不太确定在这种情况下数据是否相关。我的问题基本上是,如何使ng-repeat 数据在 orderBy 参数更改时强制重新加载。还是这与数据有某种关系?
  • 对我来说似乎是对的。我认为你应该尝试设置一个 jsFiddle。我想也许其他一些事情出了问题。

标签: javascript angularjs


【解决方案1】:

我不认为你的想法是错误的。它确实有效。这是工作的plunker

你一定是在其他地方出了问题。

app.js

var app = angular.module('ngApp', []);

app.controller('MainCtrl', ['$scope', function ($scope) {
    'use strict';
    $scope.friends = [
        {name: 'John', phone: '555-1276'},
        {name: 'Mary', phone: '800-BIG-MARY'},
        {name: 'Mike', phone: '555-4321'},
        {name: 'Adam', phone: '555-5678'},
        {name: 'Julie', phone: '555-8765'}
    ];
    $scope.setOrder = function (order) {
        $scope.order = order;
    };
}]);

主要的html

<ul class="nav nav-pills">
    <li ng-class="{'active': order=='name'}"><a href="#" ng-click="setOrder('name')">name</a></li>
    <li  ng-class="{'active': order=='phone'}"><a href="#" ng-click="setOrder('phone')">phone</a></li>
</ul>
<ul>
    <li data-ng-repeat="friend in friends|orderBy:order">
        <span class="name">{{friend.name}}</span>
        <span class="phone">{{friend.phone}}</span>
    </li>
</ul>

【讨论】:

  • 我发现了问题的原因。我在控制器开头的默认设置order var:$scope.order = 'year'; 我将您的代码与我的代码进行了比较,这是唯一的区别,删除它有帮助。不过我不明白,为什么以这种方式设置变量会导致效果......无论如何我都会接受你的回答,它帮助我找到了错误。
  • 好吧,我认为这无关紧要。你也可以在我的代码中尝试这样做。你可以试试$scope.order = 'name'; 但是感谢你接受我的回答。我很高兴能帮上忙。
  • 它实际上很重要,我又遇到了它,并问了另一个问题:stackoverflow.com/questions/14075741/…$scope.order 也是这种情况,我目前不知道为什么会这样:)
  • 你会在我的 plunker 中尝试一下吗?
  • 是的,也在一个单独的小提琴中,它有效..这就是我感到困惑的原因..我在链接的问题中更深入地描述了这个问题..我已经得到了一个答案,但我'我现在太累了,明天试试,我会及时更新。
【解决方案2】:

我知道这是一个老问题,但遇到相同问题的其他人可能会觉得这很有用。 我遇到过同样的问题。单击锚点会重新加载页面,因此,只要您单击任何表头,就会将顺序设置为默认值。这也解释了为什么不将顺序设置为默认全局为您修复它。

我用 span 元素替换了我的锚点,效果很好。

【讨论】:

猜你喜欢
  • 2014-07-31
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多