我想按照日期使用Meteor对帖子进行分组,并且仍然保留其特有的反应性。我不知道这是真的有可能。
我正在开发一个基于显微镜的网站,遵循Discover Meteor一书的说明,但我很难做出小的改动,因为我没有使用Meteor的经验。
我对原始代码簿做了一些小调整,但没有真正改变其原始结构的东西。
我需要做的是按日期对帖子进行分组,看起来像这样:
我目前的代码结构如下:
/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(氛围包),但无法在我的代码中实现包的说明。
如果这里有任何好心的人知道怎么做,我会非常感激。非常,非常! :)
答案 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);
}
})