在查看“故事”时,我希望自动订阅该故事,并在更改页面时更改已订阅的故事。
这就是我得到的:它似乎有效,但多个自动订阅似乎错了?
route("stories/:storytitle/:storyID", function(storyTitle, storyID) {
Session.set('storyID', storyID)
Meteor.autosubscribe(function() {
var storyID = Session.get('storyID');
if (storyID)
Meteor.subscribe("story", Session.get("storyID"), function() {
Router.goto('story')
});
});
});
Template.story.data = function() {
var storyID = Session.get('storyID');
var story = Stories.findOne({
_id: storyID
})
return story;
};
这似乎更符合我正在寻找的东西,但是有大量的样板。将查询放入路径而不是将其放在模板助手中似乎也是错误的。
route("stories/:storytitle/:storyID", function(storyTitle, storyID) {
Session.set('storyID', storyID)
var story = Stories.findOne({
_id: storyID
})
if (story)
Router.goto('story')
});
Meteor.autosubscribe(function() {
var storyID = Session.get('storyID');
if (storyID)
Meteor.subscribe("story", Session.get("storyID"), function() {
Router.goto('story')
});
});
Template.story.data = function() {
var storyID = Session.get('storyID');
var story = Stories.findOne({
_id: storyID
})
return story;
};
这些中的任何一种都是正确的方法吗?如何在故事中保留自动订阅,并在我更改页面时自动更改订阅?
直觉我会尝试这个:
route("stories/:storytitle/:storyID", function(storyTitle, storyID) {
Session.set('storyID', storyID)
Router.goto('story')
});
Meteor.autosubscribe(function() {
var storyID = Session.get('storyID');
if (storyID)
Meteor.subscribe("story", Session.get("storyID"), function() {
Router.goto('story')
});
});
这根本行不通。它会尝试在故事加载之前转到故事路线并抛出白屏/错误。
答案 0 :(得分:3)
第三种方法是正确的,尽管第二种方法如果你想在其他地方(例如404)路由,如果找不到故事,那么它会带来好处。一些说明:
为避免第三种方法出错,只需确保(在您的模板中)处理findOne
未返回任何内容的情况。您应该在数据从服务器完全加载之前看到这一点;数据准备好后,模板将重新呈现。
在第二种情况下将查询放入路由中没有任何问题,但请注意,它最有可能最初返回null。您需要将代码包装在反应式上下文中,以便在数据准备就绪时重新执行。您可能希望使用我的reactive router来实现此目的,或者只是复制该技术。
这样您就不需要在订阅中使用onReady
回调。 (实际上你不应该在任何一种情况下都这样做。)
第一种技术绝对不是正确的方法:)
如果您确实想要在故事不存在的情况下路由到404,您应该等到数据加载完毕,请参阅:https://github.com/tmeasday/unofficial-meteor-faq#how-do-i-know-when-my-subscription-is-ready-and-not-still-loading