我正在尝试加载登录用户的以下用户的食谱(如Twitter的家庭Feed)。 我正在使用Iron-Router RoutController。
我想查询用户在订阅中的以下用户的食谱&数据如:
Recipes.find({
author: {
$in: Meteor.user().followings
}
}, this.findOptions);
但即使我使用'obBeforeAction','Meteor.user()'也是未定义的。
部分Meteor.subscribe("followingRecipes", Meteor.user().followings, @findOptions())
并且Recipes.find author: $in: Meteor.user().followings ...
未定义。
我是Meteor的新手,我需要帮助,请帮助我,谢谢。
我的整个代码(CoffeeScript):https://github.com/yhagio/re-cip/tree/style2
//lib/router.js
FollowingRecipesController = RouteController.extend({
template: 'followingRecipes',
increment: 5,
onBeforeAction: function() {
if (!Meteor.user()) {
this.render(this.loadingTemplate);
if (Meteor.loggingIn()) {
this.render(this.loadingTemplate);
} else {
Router.go('/');
}
} else {
this.next();
}
},
postsLimit: function() {
return parseInt(this.params.postsLimit) || this.increment;
},
findOptions: function() {
return {
sort: {
submitted: -1,
votes: -1,
_id: -1
},
limit: this.postsLimit()
};
},
subscriptions: function() {
console.log('subscriptions:', Meteor.user());
this.recipesSub = Meteor.subscribe("followingRecipes", Meteor.user().followings, this.findOptions());
},
recipes: function() {
console.log('recipes:', Meteor.user());
Recipes.find({
author: {
$in: Meteor.user().followings
}
}, this.findOptions);
},
nextPath: function() {
return Router.routes.followingRecipes.path({
username: this.params.username,
postsLimit: this.postsLimit() + this.increment
});
},
data: function() {
var hasMore;
hasMore = this.recipes().count() === this.postsLimit();
return {
recipes: this.recipes(),
ready: this.recipesSub.ready,
nextPath: (hasMore ? this.nextPath() : null)
};
}
});
//server/publications.coffee
Meteor.publish('followingRecipes', function(followings, options) {
return Recipes.find({
author: {
$in: followings
}
}, options);
});
答案 0 :(得分:1)
我不是一个coffescript人,但我可以尝试解释一下这个错误
Route dispatch never rendered. Did you forget to call this.next()
in an onBeforeAction?
阅读铁路由器文档的自述文件
https://github.com/EventedMind/iron-router#migrating-from-094
来自文档
onRun和onBeforeAction挂钩现在要求你调用this.next(),不再采用pause()参数。因此默认行为是相反的。例如,如果你有:
Router.onBeforeAction(function(pause) {
if (! Meteor.userId()) {
this.render('login');
pause();
}
});
您需要将其更新为
Router.onBeforeAction(function() {
if (! Meteor.userId()) {
this.render('login');
} else {
this.next();
}
});
这意味着你在onBeforeAction函数的任何地方,如果你想要继续流程,就像你想要在检查用户登录后运行钩子(action,onAfterAction),你需要写this.next()
到继续流程
Ex代码
Router.onBeforeAction(function() {
if (! Meteor.user()) {
this.render('login');
} else {
this.next();
}
});
在上面的代码中,如果用户已登录,则流程将继续并执行下一个功能,如action,data,onAfetrAction,否则将呈现登录模板
答案 1 :(得分:1)
是否因为客户端尚未知道用户集合? 在waitOn函数中订阅客户端。
类似的东西:
this.route('myaccount',{
waitOn: function() {
Meteor.subscribe('experts-all'); // users
},
onBeforeAction: function () {
if (!Meteor.user()) {
Router.go('signin');
}
else this.next();
},
template: 'myAccount',
});