2013-12-14 47 views
1

我想等待所有數據從訂閱中下載,然後在開始時一次爲它們創建地圖標記。要做到這一點,我有一個會話變量設置爲false。然後,當onReady調用時,我初始化所有標記。然後我將會話變量設置爲true,表示第一次傳遞已在並初始化。在我觀察到的回調中,我檢查會話變量,只要它是false,我不添加任何標記。那麼,如果它是真的,我會添加標記 - 假設這些標記的非已經被初始化。然而,有時候,我會重複計算並創建兩倍的標記。流星訂閱onReady()和觀察()添加了雙重計數

我想問一個好的第一個問題是onReady和觀察之間的關係是什麼添加的?它在文檔中不太清楚。這甚至是正確的做事方式 - 創建一個會話變量來抑制觀察增加的功能,直到onReady完成?我不這麼認爲。另外請注意,雙重計數不會每次都發生,所以它是一個計時事情...有點煩人。

感謝

+0

您的'.observe'查詢是否可以被反應重新運行?在'Deps.autorun','Template' helper中,還是在其'.find()'查詢中有反應參數? – Akshat

+0

它在一個模板呈現函數 – Chet

回答

1

是的,這是observe()的行爲。最初運行觀察時,它將有一個初始查詢,它將匹配所有內容並運行到added

onReady尚未開始但當前收集爲空時,它也會出現,因此最初的那些不可見。這是在文檔中提到的

在觀察返回之前,添加(或addedAt)將被稱爲零次或多次以提供查詢的初始結果。

我不確定完全如何避免最初的項目。我做了這樣的事情在過去的:

var QueryHandle = Collection.find().observe({ 
    added: function() { 
     if(!QueryHandle) return false; 
    }); 

我知道這工作在服務器上,但我不能肯定,如果它在客戶端上。

另一種解決方案是運行手柄onReady調用之前,只有中斷返回倘認購事項完成:即

Meteor.subscribe("collection", function() { 
    subscribed = true; 
}); 

var QueryHandle = Collection.find().observe({ 
    added: function() { 
     if(!subscribed) return false; 
    } 
); 

要小心,不要在Deps.autorun運行這個,因爲那將是再次運行如果.find()查詢參數是被動的。

有時可能會發生這取決於服務器響應的速度。如果你使用Session它會成爲一個反應散列,所以如果它發生得足夠快,訂閱返回true。請嘗試使用普通變量。

如果沒有幫助,可能會有其他方法可以避免初始問題和更深層次的問題,但可能需要深入研究livedata包。

+0

這基本上是我有除了會話變量之外的設置。我明白你的意思 - 我試着用一個普通的變量來看看它是如何工作的。謝謝 – Chet