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

3番目のアプローチは正しいですが、2番目のアプローチには、ストーリーが見つからない場合に別の場所(404など)にルーティングする場合に利点があります。いくつかのメモ:

  1. findOne3番目のアプローチでのエラーを回避するには、(テンプレートで)何も返されない場合に対処するようにしてください。データがサーバーから完全にロードされる前に、これが表示されることを期待する必要があります。データの準備ができると、テンプレートが再レンダリングされます。

  2. 2番目のケースでは、ルートにクエリを配置しても問題はありませんが、最初はnullが返される可能性が高いことに注意してください。データの準備ができたときにコードが再実行されるように、コードをリアクティブコンテキストでラップする必要があります。これを実現するために私のリアクティブルーターを使用するか、テクニックをコピーすることをお勧めします。

    onReadyこのように、サブスクリプションでコールバックを使用する必要はありません。(実際には、どちらの場合もこれを行う必要はありません)。

  3. 最初のテクニックは間違いなくそれを行う正しい方法ではありません:)

  4. ストーリーが存在しない場合に404​​にルーティングする場合は、データが読み込まれるまで待つ必要があります。https ://github.com/tmeasday/unofficial-meteor-faq#how-do-i-knowを参照してください。 -my-subscription-is-ready-and-not-still-loadingの場合

于 2012-10-27T21:21:52.593 に答える