我仍然在我的Meteor.js应用程序上,并希望在我的页面上显示当前用户朋友的所有帖子。
目前,我只是像这样展示每一篇文章:
talkthreads: function(){
return Posts.find({parent: null},{sort: {date: -1}});
}
但我想做一些尽可能简单/有效的事情来过滤它们,并且只有来自用户朋友的那个。
类似的东西:
talkthreads: function(){
return Posts.find({parent: null, owner: [match one of my friend id]}, {sort: {date: -1}});
}
正如我对SQL所做的那样。
另一点是我目前将我的帖子集合发布给所有客户端。但由于它的目标是随着时间的推移而增长,我不想将所有帖子发布给每个客户。
我如何才能发布和订阅我或我朋友所拥有的帖子,而且数量有限:我不想一次加载超过15个帖子。当我点击一个按钮时,我再加载15个(就像在FB上一样,当你在页面底部滚动时,它会自动添加较旧的帖子)。
感谢您的帮助。
答案 0 :(得分:2)
您要求的是客户端加入。假设Meteor.user().profile.friends
是一个用户ID数组,这样的东西应该在你的帮助器中起作用:
talkthreads: function() {
// select owners who are friends of the current user
// see the publish example if you want to include your own posts
var owners = Meteor.user().profile.friends || [];
var selector = {
parent: null,
owner: {$in: owners}
};
return Posts.find(selector, {sort: {date: -1}});
}
你问题的后半部分是关于分页的。这可能是一个单独的问题最好的问题,但是这里有关于如何设置发布者的想法:
var POSTS_PER_PAGE = 15;
Meteor.publish('paginatedPosts', function(pageNumber) {
// fetch the current user because Meteor.user() isn't available here
var user = Meteor.findOne(this.userId);
// get an array of user ids for the user's friends
var owners = user.profile.friends || [];
// also add the current userId to the list of owners
owners.push(this.userId);
var selector = {
parent: null,
owner: {$in: owners}
};
// publish a limited set of posts based on the current page
var options = {
limit: POSTS_PER_PAGE * pageNumber,
sort: {date: -1}
};
return Posts.find(selector, options);
});
在客户端上,您需要跟踪当前页面(从1开始并在每次单击&#34时增加;加载更多"按钮)并在页面时激活订阅数字变化。例如:
Tracker.autorun(function() {
var pageNumber = Session.get('currentPage') || 1;
Meteor.subscribe('paginatedPosts', pageNumber);
});
当然,这可能是模板自动运行,全局或路由器,具体取决于对您的应用有意义的内容。
答案 1 :(得分:1)
我假设您的用户有一系列朋友_id,您可以使用它们进行查询。在这种情况下,您正在寻找这样的查询:
Posts.find({parent: null, owner: Users.find({_id: user_is}, {friends: 1, _id: 0})}, {sort: {date: -1}});
基本上使用Mongo,您可以嵌套搜索,这样就可以获得所需的数据。