1

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

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

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

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

4

1 回答 1

3

第三种方法是正确的,尽管第二种方法有它的好处,如果你想在没有找到故事的情况下路由到其他地方(例如 404)。一些注意事项:

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

  2. 在第二种情况下,在您的路线中放置查询没有任何问题,但请注意,它最初很可能会返回 null。您需要将代码包装在反应式上下文中,以便在数据准备好时重新执行。您可能想使用我的反应式路由器来实现这一点,或者只是复制该技术。

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

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

  4. 如果您确实想在故事不存在的情况下路由到 404,则应等到数据加载完毕,请参阅:https ://github.com/tmeasday/unofficial-meteor-faq#how-do-i-know -当我的订阅准备好但尚未加载时

于 2012-10-27T21:21:52.593 回答