使用Meteor按日期分组

时间:2014-08-14 19:38:00

标签: javascript meteor

我想按照日期使用Meteor对帖子进行分组,并且仍然保留其特有的反应性。我不知道这是真的有可能。

我正在开发一个基于显微镜的网站,遵循Discover Meteor一书的说明,但我很难做出小的改动,因为我没有使用Meteor的经验。

我对原始代码簿做了一些小调整,但没有真正改变其原始结构的东西。

我需要做的是按日期对帖子进行分组,看起来像这样:

  • 今天
    • Post 7
    • Post 6
    • Post 5
  • 昨天
    • Post 4
    • Post 3
  • 2014年8月11日
    • Post 2
    • Post 1

我目前的代码结构如下:

/client/view/posts/posts_list.js

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

/client/view/posts/posts_list.html

<template name="postsList">
    <div class="posts">
        {{#each posts}}
            {{> postItem}}  
        {{/each}}
        {{#if nextPath}}
            <a class="load-more" href="{{nextPath}}">Show more</a>
        {{/if}}
    </div>
</template>

/client/view/posts/post_item.js

Template.postItem.helpers({
    ownPost: function () {
        return this.userId == Meteor.userId();
    },
});

/client/view/posts/post_item.html

<template name="postItem">
    <div class="post">
        <div class="post-content">
            <h3><a href="{{url}}">{{title}}</a><span>{{description}}</span></h3>
        </div>
        <div class="post-comments">
            <a href="{{pathFor 'postPage'}}">{{commentsCount}} comments</a>
        </div>
        {{#if ownPost}} 
            <a href="{{pathFor 'postEdit'}}">Edit</a>
        {{/if}}     
    </div>
</template>

/collections/posts.js

Posts = new Meteor.Collection('posts');  
Posts.allow({
    update: ownsDocument,
    remove: ownsDocument
});

Meteor.methods({
    post: function(postAttributes) {
        var user = Meteor.user(), postWithSameLink = Posts.findOne({url: postAttributes.url});
        if(!user)
        throw new Meteor.Error(401, "You need to be a registered user to do this");
        if(!postAttributes.title)
            throw new Meteor.Error(422, "Please, fill the name field");
        if(!postAttributes.description)
            throw new Meteor.Error(422, "Please, fill the description field");
        if(!postAttributes.url)
            throw new Meteor.Error(422, "Please, fill the URL field");
            if(postAttributes.url && postWithSameLink) {
            throw new Meteor.Error(302, "This URL already exist", postWithSameLink._id);
        }

        var post = _.extend(_.pick(postAttributes, 'url', 'title', 'description'), {
            userId: user._id,
            author: user.username,
            submittedDate: new Date().getTime(),
            commentsCount: 0
        });     

        var postId = Posts.insert(post);
        return postId;
    }
});

/server/publications.js

Meteor.publish('posts', function(options) {
    return Posts.find({}, options);
});

Meteor.publish('singlePost', function(id) {
    return id && Posts.find(id);
});

Meteor.publish('comments', function(postId) {
    return Comments.find({postId: postId});
});

Meteor.publish('notifications', function() {
    return Notifications.find({userId: this.userId});
});

我尝试了几种我在这里和GitHub上找到的解决方案,但是我无法使它们工作。我尝试的解决方案是:

StackOverflow 1(流星问题644):Are "group by" aggregation queries possible in Meteor, yet?

GitHub Arunoda的方法:https://github.com/arunoda/meteor-smart-collections/issues/47

另外,我尝试使用list-grouper(氛围包),但无法在我的代码中实现包的说明。

如果这里有任何好心的人知道怎么做,我会非常感激。非常,非常! :)

2 个答案:

答案 0 :(得分:0)

我没有找到提交的日期&#39;流星文档对象上的属性。当您向数据库中插入新文档(条目)时,可能需要将当前日期/时间指定为其余参数之一。

答案 1 :(得分:0)

我认为,处理核心问题需要的代码多于处理核心问题所需的代码。我简化了一点 - 希望这会有所帮助。我会注意到我不是专家 - 也在学习。我没时间测试这个。但我认为它解决了实现你所需要的一种方式。

我认为模板的基本结构看起来像这样。

<ul>
    {{#each post}}
        {{if isNewDate}}
            <ul>
               <li>{{writeDate}}</li>
            </ul>
        {{/if}}
        <li>{{postName}}</li>
    {{/each}}
</ul>

我认为helpers.js文件可能看起来像这样。

var tempDate = {}; //we need a variable outside the scope of the helper functions 
Template.foobar.helpers ({
    post: function(){
        Posts.find({}, {sort: {submittedDate: -1}}); 
    },
    isNewDate: function(){
        //test if the date of this record matches the date of the previous record
        //if it's new, return true.
        //see momentJS -- makes dealing with dates sooooo much easier
        if( moment().format("LL", this.submittedDate) !== moment().format("LL", tempDate)){
            tempDate = this.submittedDate;
            return true;
        } else {
            return false;
        }
    },
    writeDate: function(){
        return moment().format("LL", this.timestamp);
    }
})