0

Meteor と Meteor Router を使用して、テスト アプリケーションでルーティングを提供しています。以前の質問へのフォローアップです: Meteor を使用して、「動的ルート」を持つことは可能ですか?

現在、その質問で提供された回答を実装しました。私のルートは次のようになります。

Meteor.Router.add({
  '/:type/:name': function(type, name) {

    //just checking the type and name are correct!
    console.log("type: " + type);
    console.log("name: " + name);
    var activity = Activities.findOne({name: name});
    Session.set("currentActivity", activity._id);
    return 'itemPage';
  },
  //more entries here
});

この時点で、ブラウザの URL は次のようになります。

http://localhost:3000/bar/someCoolBar

このコードは、メイン ページでリンクをクリックして itemPage にアクセスすると、問題なく動作します。Activitiy.findOne は正しいアクティビティを正常に検出し、Activity._id を取得できます。

ただし、ページを手動で更新するか、ブラウザーのアドレス バーにその URL を手動で入力して、その itemPage に直接移動すると、次のエラーが発生します。

Uncaught TypeError: Cannot read property '_id' of undefined client.js:34
Meteor.Router.add./:type/:name client.js:34
(anonymous function) router_client.js:59
(anonymous function) router_client.js:31
_.extend._compute deps.js:129
Deps.Computation deps.js:64
_.extend.autorun deps.js:255
Router._setPageFn router_client.js:23
(anonymous function) index.js:278
next index.js:166
page.dispatch index.js:169
page.replace index.js:148
page.start index.js:103
page index.js:60
(anonymous function) router_client.js:176
ready

だから、なぜこれがうまくいかないのか理解できません。「タイプ」と「名前」の console.log は正しい値を示しているので、Activity.findOne() は期待どおりに動作するはずです。しかし、そうではありません。上記のエラー ログの次の行:

Uncaught TypeError: Cannot read property '_id' of undefined client.js:34

私の client.js の次のコード行に対応します。

Session.set("currentActivity", activity._id);

これは、findOne が結果を見つけられず、var アクティビティが定義されていないことを示しています。リンクをクリックするとルーティングが機能するのに、ブラウザーのアドレス バーに手動で URL を入力すると機能しないのはなぜですか?

ありがとうございました!

4

1 に答える 1

1

activityMeteor が最初にブラウザーにロードされるとき、使用可能なデータがないため、返されるケース (前の行) を考慮できる必要がありますnull

var activity = Activities.findOne({name: name});

データは引き続きサーバーからダウンロードされるため (したがって、_idまだ存在しないため、未定義のエラーが発生します)

次のようなもので問題ありません。

var activity = Activities.findOne({name: name});
if(activity) Session.set("currentActivity", activity._id);

また、サブスクリプション コールバックを使用して、ページの読み込み/読み込みを確認し、ページに表示することもできます。

于 2013-06-20T06:50:38.417 に答える