2014-05-20 58 views
0

我測試了一些例程,流星有,我想知道這是這是正常的行爲,或者有問題的話...流星奇怪的行爲

我會一步一步描述:

發佈我的收藏,以只有我想要什麼

服務器/ publish.js

Meteor.publish('decisions', function (decisionCursor) { 
    return Decisions.find({ active: true }, { limit: 20, skip: decisionCursor }); 
}); 

Meteor.publish('decisionsToModerate', function (decisionCursor) { 
    return Decisions.find({ active: false }, { sort: { createdAt: -1 }, limit: 1, skip: decisionCursor }); 
}); 

我訂閱我的客戶既收集出版物

客戶端/ client.js

Meteor.startup(function() { 
    SimpleSchema.debug = true; 
    Session.setDefault('decisionCursor', 0); 
    Deps.autorun(function() { 
     Meteor.subscribe("decisions", Number(Session.get('decisionCursor'))); 
     Meteor.subscribe("decisionsToModerate", Number(Session.get('decisionCursor'))); 
    }); 
}); 

我設置的功能,以防止調用查詢每次檢索兩個集合...

客戶端/ lib目錄/ environment.js

activeDecisions = function() { 
    var decisions = Decisions.find({active: true}); 
    console.log(decisions.fetch().length); // PROBLEM HERE 
    return decisions; 
}; 
moderateDecisions = function() { 
    return Decisions.find({active: false}); 
}; 

創建我的觀點的東西

客戶端/視圖/家庭/ home.js

Template.home.activeDecisions = function() { 
    var decisions = activeDecisions(); 
    return decisions; 
}; 

正如你所看到的,在客戶端/ lib目錄/ environment.js我加入一條線,你看到那裏我看到了問題......

當我去http://localhost:3000/鐵路線負載

this.route('home', { 
    path: '/', 
    layoutTemplate: 'masterLayout' 
}); 

如果我得到ØChrome的控制檯,因爲我在客戶端/ lib中寫道/ environment.js它應當返回一行與一些Decisions文件,在這種情況下,我只有3組活動的決定,但Chrome輸出這個:

0 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3 
3 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3 
3 environment.js?9868bbbef2024c202fd33213ed060f067dadbe75:3 

三行,第一個告訴我我有0個文件(什麼?我有三個活動文檔),接下來的兩行告訴我我想知道的是什麼,我有三個文檔。

我想要這個號碼,因爲我想將它設置在一個會話變量中,每次查詢被調用時都會更新,因爲如果我將它設置在其他地方(比如說,例如Template.home.rendered),我將創建兩個querys,要慢一些。

所以我看到的問題是,我不知道爲什麼流星寫入控制檯三次,如果我告訴它只寫一次,當查詢被解析爲一個變量......如果我設置會話它將是0,然後3,然後3 ...這可能會導致一些錯誤?

回答

1

模板幫助程序形成一個反應性上下文 - 如果它們內部的反應變量得到更新,幫助程序將再次運行。因此,只要activeDecisions返回的光標得到更新,您就會看到該行被打印到控制檯。

功能在模板第一次渲染時打印0是完全合理的。請記住,在模板呈現之前,您訂閱的文檔可能尚未到達客戶端。隨着新文件到達或更新,activeDecisions將再次評估。有關更多詳情,請參閱我的blog post上的類似主題。回到原來的問題,你可以設置一個會話變量爲光標計數(順便說一句,cursor.count()cursor.fetch().length更有效)。當該計數得到更新時,您的會話變量也會更新。因爲會話變量是被動的,所以它的所有依賴將會重新運行,依此類推。

+0

謝謝你,你的回答和你的文章是完美的我的情況,並解釋它非常好:) –

+0

優秀!我很高興這很有幫助。 :) –

+0

我已經打開了另一個prolem,類似於這個但不一樣...如果你可以看看... http://stackoverflow.com/questions/23772693/meteor-publish-subscribe-is-沒有反應 –