2013-05-01 55 views
6

爲什麼在下面的基本例子裏面返回的collection裏面呈現的函數是空的?
啓用自動發佈功能。頁面加載調用命令
Coll.find().fetch() JavaScript控制檯返回內部之後正確的設置項流星template.rendered - 爲什麼集合是空的?

這裏是代碼

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/)線程。 – 2013-05-01 08:09:28

回答

5

流星建關閉數據線型結構回覆。這意味着當應用程序最初加載HTML時,首先發送JS,然後再發送數據。

您必須使用反應性來檢查數據更改或檢查集合的訂閱何時完成(這需要刪除自動發佈軟件包)。 (你可以看看如何將您的應用程序在文檔移動到手動訂閱:http://docs.meteor.com/#publishandsubscribe

訂閱回調告訴你時,返回的數據:

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

模板還可以做出反應(就像你正在做的那樣),但是.rendered未被調用,因爲流星首先檢查模板的html是否已經改變& 只有當它不同時它會改變其HTML並調用呈現的回調。

你有什麼作爲一個選項這裏是1)使用Deps.autorun代替,或

2)我不知道爲什麼你在你的呈現回調使用這一點,但如果有必要把它放在那裏,你需要確保模板的HTML發生更改,方法是從集合中引入一些HTML,以便在引入新數據時進行更改。

+0

我也被困在這裏。你能詳細解釋一下嗎?我試圖手動渲染一個模板,該模板生成一個c3 js圖表,並試圖從數據庫加載數據,但獲得上面的空數組。 – radtek 2014-10-21 03:00:27

+0

@radtek Meteor通過先發送html,然後再發送數據。當您呈現的回調觸發時,數據可能不會或可能已發送。在繪製圖表之前,您必須確保您使用上述方法之一或鐵路路由器的'subscribe('..')。wait()'命令等待它到達。 – Akshat 2014-10-21 04:11:39

+0

是的,我知道的很多。我猜我以後是使用c3 js流星包的例子。對靜態數據可以正常工作,但應該有一個使用db數據的最佳實踐示例。我會看到我今晚晚些時候想到的。當我試圖呈現html然後訂閱並通過句柄放出數據時,我試圖在模板本身內生成一個js腳本,但是當我爲每個腳本創建一個時,句柄會創建一個新行,因此它甚至不是可解析的js。 var data = []; data.push({{each_item}}); 。所以我認爲這太hacky,需要有更好的方法 – radtek 2014-10-21 14:39:37