【问题标题】:How do I sort a collection that has already been rendered? Like AngularJS's orderBy directive如何对已经渲染的集合进行排序?像 AngularJS 的 orderBy 指令
【发布时间】:2015-07-16 09:07:03
【问题描述】:

如何对已呈现的数据集合进行排序或操作?

我注册了一个模板助手,其定义或多或少类似于:

Template.home.helpers({
    posts: function() {
          return Posts.find({}, { sort: { createdAt: -1 } });
    }
});

按照最先出现的最新帖子对帖子进行排序。但我想实现一个功能来扭转这一点;首先显示最旧的帖子。

MeteorJS 的做法是什么?非常感谢任何想法/帮助。

【问题讨论】:

    标签: javascript meteor meteor-blaze meteor-helper


    【解决方案1】:

    我会使用会话变量来实现,如下所示:

    首先,设置默认降序显示:

    Template.home.onRendered({
        Session.set("displayOrder", -1);
    });
    

    然后,在 html 中的某处定义一个链接,以允许用户更改顺序:

    <a href="#" id="sort">Change sort order</a>
    

    然后定义一个事件来切换点击时的排序顺序

    Template.home.events({
        'click #sort' : function () {
            var order = Session.get("displayOrder");
            var newOrder = -1 * order;
            Session.set("displayOrder", newOrder);
        }
    });
    

    然后改变你的助手,像这样:

    Template.home.helpers({
        posts: function() {
          var displayOrder = Session.get("displayOrder")
          return Posts.find({}, { sort: { createdAt: displayOrder } });
        }
     });
    

    【讨论】:

    • 有效!太感谢了!我完全没有想到我会这样做。但是你介意解释一下这是如何工作的吗?如果我理解正确。单击链接/按钮会更改或设置 Session 中的值,因此它会重新运行 posts 辅助函数并重新呈现模板 - 是否正确?
    • 是的,没错。此外,由于 Session 是客户端变量,因此按一个客户端排序不会影响它在其他客户端上的显示方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2011-04-04
    • 2016-10-17
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多