流星路线和自动订阅

时间:2012-10-24 17:23:38

标签: javascript meteor router

在查看“故事”时,我希望自动订阅该故事,并在更改页面时更改已订阅的故事。

这就是我得到的:它似乎有效,但多个自动订阅似乎错了?

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')
    });
});

这根本行不通。它会尝试在故事加载之前转到故事路线并抛出白屏/错误。

1 个答案:

答案 0 :(得分:3)

第三种方法是正确的,尽管第二种方法如果你想在其他地方(例如404)路由,如果找不到故事,那么它会带来好处。一些说明:

  1. 为避免第三种方法出错,只需确保(在您的模板中)处理findOne未返回任何内容的情况。您应该在数据从服务器完全加载之前看到这一点;数据准备好后,模板将重新呈现。

  2. 在第二种情况下将查询放入路由中没有任何问题,但请注意,它最有可能最初返回null。您需要将代码包装在反应式上下文中,以便在数据准备就绪时重新执行。您可能希望使用我的reactive router来实现此目的,或者只是复制该技术。

    这样您就不需要在订阅中使用onReady回调。 (实际上你不应该在任何一种情况下都这样做。)

  3. 第一种技术绝对不是正确的方法:)

  4. 如果您确实想要在故事不存在的情况下路由到404,您应该等到数据加载完毕,请参阅:https://github.com/tmeasday/unofficial-meteor-faq#how-do-i-know-when-my-subscription-is-ready-and-not-still-loading