2013-07-18 3 views
7

GameStatusという名前のMeteorコレクションがあるとします。私はさまざまな役割を持つユーザーを持っていますが、すべてのユーザー用にGameStatusコレクションを公開しています。私は単に役割(「S」と「B」)私は、次のテンプレートヘルパーを使用して問題がないの2のために、サーバに次/ publications.coffeeMeteor findOneクエリは、1つのテンプレートヘルパーで未定義を返します。他のテンプレートヘルパーでは、同じクエリがうまく機能します

Meteor.publish 'gamestatus', -> 
    GameStatus.find() 

を使用します(ファイルで定義されてクライアント/ビュー/ seller.coffeeクライアント/ビュー/ buyer.coffee)これらについては

currentRound: -> 
    return GameStatus.findOne().currentRound 

私は次のエラーを取得することはありません。 (ファイルクライアント/ビュー/ admin.coffeeで定義された)同じテンプレートヘルパーを使用して

Uncaught TypeError: Cannot read property 'currentRound' of undefined 

しかし、別の役割(「管理者」)のための

は、上記のショー捕捉されない例外TypeErrorを与えます。代わりに次のように書くと機能します。

currentRound: -> 
    return GameStatus.findOne()?.currentRound 

これはなぜ機能するのですか。私は、コレクションが最初にページが読み込まれているときに利用できないと考えています。しかし、なぜこれは上記の他のテンプレートでも起こりませんか?

誰かがこれを明確にすることができれば本当に感謝します。

+0

コールバックでは、コンソールに何かを記録して、いつ利用可能かを知って、失敗した呼び出しで同じことをします。あなたの仮説をテストすることができます。 –

+0

@MrD私に例を教えてもらえますか?サブスクリプションがいつ利用可能になったかを私が知るのを助けるでしょう。この特定の役割のためだけに彼らが最初に利用可能ではないようだ。 – Curious2learn

+0

https://gist.github.com/devonbarrett/b698c10cc427ee2c1811を購読して、このようなことをして、currentRound関数と同様のものをログに記録し、コレクションの準備が完了する前に消滅するかどうかを確認してください。 –

答えて

13

コレクションの準備が整っているとは必ずしも一致しているとは思わないので、すべての基盤をカバーする場合は、コレクションが準備できていない場合を常にコーディングしてください。

準備が整っていないコレクションを扱うためのクイック・アンド・ダーティな方法と、todosの例で見つかるより洗練されたソリューションがあります。

クイックで汚れたソリューションは、このようになります。

currentRound: -> 
    gameStatusrecord = GameStatus.findOne(); 
    if(gameStatusRecord) 
    gameStatusRecord.currentRound 

これは動作します。コレクションが準備されるまで、currentRoundはnullを返し、テンプレートは簡単にレンダリングされ、おそらく現在のラウンドの空白が表示されます。だから理想的なユーザーエクスペリエンスではなく、巨大なものではありませ

より洗練されたソリューションでは、購読しているコレクションが「準備完了」機能を使用して照会できる状態かどうかを確認できます。コレクションが準備できていない場合は、コレクションの準備ができるまでcurrentRoundヘルパーが呼び出されないようにする、「読み込み」などの他のテンプレートをレンダリングすることができます。例えば

は、ドスの例では、クライアントはtodos.jsのライン24上の「リスト」コレクションをサブスクライブ:

var listsHandle = Meteor.subscribe('lists', function() { 

そして、ドスのライン80上のリストテンプレートのヘルパー関数を定義します.jsファイル

Template.lists.loading = function() { 
    return !listsHandle.ready(); 
}; 

はその後todos.htmlライン20でリストテンプレートでは、listsHandleの準備ができない限り、任意のテンプレートをレンダリングしようとしません。

<h3>Todo Lists</h3> 
{{#if loading}} 
    <div id="lists">Loading...</div> 
{{else}} 
    <div id="lists"> 
    {{#each lists}} 
    <!--etc.--> 
+0

ありがとうあなたの提案。 – Curious2learn

関連する問題