【问题标题】:Reverse list in ng-repeatng-repeat 中的反向列表
【发布时间】:2014-02-12 17:45:13
【问题描述】:

所以我有一个数组,我正在使用 ng-repeat 来渲染,但我想反转这个列表。以前我使用过从这个答案中得到的过滤器:angular ng-repeat in reverse

但现在我得到一个错误:“TypeError: Object # has no method 'slice' 在 Scope 上。”我不确定这是因为 AngularJS 的新版本还是我遗漏了一些东西。

这是我的过滤代码:

.filter('reverse', function () {
return function(items) {
    return items.slice().reverse();
};

这是我从 div 内部查看的代码:

data-ng-repeat='feed in feeds | reverse'

【问题讨论】:

  • 看起来 feed 不是数组...
  • 我正在使用 firebase 将本地 $scope.feeds 对象与后端绑定。
  • 所以项目可能未定义。请检查此项并在不修改的情况下退货或不退货
  • @ph3bell - 我建议你接受 ChenR 的回答,因为它是在所有情况下都能做到这一点的最简单的回答,而且它目前位于底部:stackoverflow.com/a/36378649/985026

标签: angularjs angularjs-ng-repeat angularjs-filter


【解决方案1】:

要使数组反向渲染并按“id”排序,应该可以:

data-ng-repeat="feed in feeds | orderBy:'id':true"

让我知道这是否适合你。

供您参考:http://jsfiddle.net/byizzy/pgPVU/3/

【讨论】:

  • 完美.. 谢谢... :)
【解决方案2】:

这有点棘手,但对于所有有兴趣在不创建新谓词函数和/或修改数组等的情况下反转数组的人...

ng-repeat="feed in feeds | orderBy:'':true"

ng-repeat="feed in feeds | orderBy:'-'"

解释
如果将第二个参数留空字符串,那么 Angular 将按照数组的默认顺序(索引)进行排序,在末尾添加 true 将启用 Angular 的 reverse 参数'orderBy

【讨论】:

  • 您的建议也会对数组进行排序,这在 OP 的问题中不是预期的效果,完整的解决方案将是 orderBy: '[]': true,因此有 0 个谓词并且顺序保持不变,只是颠倒了
  • 谢谢!我正在寻找一种方法来反转默认顺序。 '-' 为我工作。
【解决方案3】:

请直接使用Java脚本的切片函数,如下所示:

data-ng-repeat="item in items.slice().reverse()"

【讨论】:

  • 我会避免使用从 DOM 调用的两个函数,因为如果列表变得越来越大,它可能会占用 DOM 渲染时间。如果您绝对必须这样做,请在您的 JS 代码中执行此还原。虽然在其他答案下面列出了内置的 angularjs 选项。
【解决方案4】:

单一提要的结构是什么?看来您可以使用 angular 的内置过滤器按照您想要的方式对其进行排序。例如,如果字段“id”是在数组中提供“order”的,你可以这样做:

data-ng-repeat='feed in feeds | orderBy:id' 

如果你想反过来,你就这样做:

data-ng-repeat='feed in feeds | orderBy:id:reverse'

这有意义吗?不确定您是否需要自己的过滤器。如果是这种情况,也许尝试调试(即写入控制台或其他方式)以查看您实际传递的内容。如果它不是一个数组,那是你的问题,否则试试这个:

return Array.prototype.slice.call(items).reverse(); 

如果其中任何一个对你有用,请告诉我!

【讨论】:

  • 我对 javascript 和 angularJS 都很陌生,所以如果我不能更具体地了解我正在处理的类型,我真的很抱歉,因为坦率地说,我不太确定!但我真的很感谢到目前为止我得到的帮助。提要的结构如下所示: feedid:{id: 'id of user', meta: 'some description', name: 'name of user'} 当用户发布提要时,它位于底部,我希望它在顶部呈现(想象一下 twitter-feed)。
  • 我正在使用 Angular 1.13.15 和 post 范围变量 = [{ title: 'one', upvotes: 500 }, { title: 'two', upvotes: 400 }] 和看似数据- ng-repeat="post in posts | orderBy:upvotes:reverse" 不起作用,有什么建议吗?
【解决方案5】:

希望这能解决您的问题

data-ng-repeat='feed in feeds.reverse()'

【讨论】:

    【解决方案6】:

    一种不对数组进行排序,而只是复制和反转它的解决方案: ng-repeat="item in items | orderBy : '[]': true"

    【讨论】:

      【解决方案7】:

      实现 AngularJs 反向的另一种替代方法是

      <div ng-repeat="item in items | orderBy:'$index':true">
        <code>{{item.id}} - {{item.name}}</code>
      </div> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-22
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多