2013-05-01 5 views
6

なぜ次の基本例では、返された関数内の返されたコレクションは空ですか?
自動公開が有効になっています。ページのロードは、コンソールに戻ります。ここでエントリMeteor template.rendered - コレクションが空ののはなぜですか?

の設定が正しいジャバスクリプト内
Coll.find().fetch()コード

t.js

Coll = new Meteor.Collection("coll"); 

if (Meteor.isClient) { 
    Template.tpl.rendered = function(){ 
    console.log(Coll.find().fetch()); // <-- This line prints empty array 
    }; 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
     if (Coll.find().count() === 0) { 
      var f = ["foo","bar"]; 
      for (var i = 0; i < f.length; i++) 
       Coll.insert({f: f[i]}); 
     } 
    }); 
} 

そしてt.htmlファイル

<head> 
    <title>test</title> 
</head> 

<body> 
    {{> tpl}} 
</body> 

<template name="tpl"> 
    Test tpl 
</template> 
+0

コレクションがまだ読み込まれていないためです。 'Template.rendered'は起動されていて、コレクションがロードされているわけではありません。 [this](http://stackoverflow.com/questions/15129827/)スレッドを確認してください。 –

答えて

5

流星が内蔵されているコマンドを呼び出した後ワイヤ上のデータ型構造体のオフ再。これは、アプリケーションが最初にHTML &をロードしたときにJSが最初に送信され、そのデータが後で送信されることを意味します。

データの変更をチェックしたり、コレクションへのサブスクリプションが完了した時点(自動公開パッケージを削除する必要がある)を確認するには、反応性を使用する必要があります。データが返されたときに、サブスクリプション・コールバックがわかります

Meteor.subscribe("coll", function() { 
    //Data subscription complete. All data is downloaded 
}); 

テンプレートは、反応性行うことができます(:(http://docs.meteor.com/#publishandsubscribeあなたは、ドキュメントで手動のサブスクリプションにアプリを移動する方法をチェックアウトすることができます)しかし、.renderedが呼び出されていないのは、Meteorが最初にテンプレートのhtmlが変更されたかどうかを調べるためです。 異なる場合のみ HTMLを変更し、レンダリングされたコールバックを呼び出します。ここでのオプションが1にあるようあなたが持っている何

)が代わりにDeps.autorun、または

2)を使用し、私はあなたのレンダリングコールバックでこれを使用している理由はわからないが、そこにそれを置くことが必要であるならば新しいデータが導入されたときに変更されるコレクションからhtmlに何かを導入することによって、テンプレートのHTMLが確実に変更されるようにする必要があります。

+0

私もここにこだわっています。これについて詳しく説明できますか?私は手動でc3 jsグラフを生成するテンプレートをレンダリングしようとしていますが、データベースからデータをロードしようとしていますが、上記のように空の配列を取得しようとしています。 – radtek

+0

@radtek Meteorはhtmlを最初に送信し、その後データを送信します。レンダリングされたコールバックが起動すると、データが送信されなかったり送信されたりすることがあります。上記の方法の1つ、または鉄のルータの 'subscribe( '..')。wait()'コマンドを使ってチャートを描画する前に、それが到着するのを待つようにする必要があります。 – Akshat

+0

それほど私は知っている。私が思うのは、使用中のc3 js流星群の例です。静的データでうまく動作しますが、dbデータを処理するためのベストプラクティスの例が必要です。私は今夜​​後に私が何を思いつくのか見ていきます。 htmlをレンダリングして、ハンドルバーを使ってデータを購読して出そうとしたとき、テンプレート自体の中にjsスクリプトを生成しようとしましたが、それぞれを処理するときにハンドルバーが新しい行を作成します。 var data = []; data.push({{each_item}}); 。だから私はこれがあまりにもハッキーだと思ってより良い方法が必要になりました – radtek

関連する問題