2014-02-24 155 views
1

我的發佈功能發佈後的記錄是這樣的:流星之前和用戶登錄

Meteor.publish('ownedrecords', function() { 
     if (!this.userId) { 
      this.error(new Meteor.Error(500, 'Internal server error')); 
      return; 
     } 
     return Records.find({owner:this.userId}); 
    }); 

我訂閱的客戶是這樣的:

Meteor.subscribe("ownedrecords") 

但用戶後登錄,在客戶端不沒有得到用戶擁有的記錄。所以我這樣做:

Deps.autorun(function() { 
      var user = Meteor.userId(); 
      Meteor.subscribe("ownedrecords"); 
    } 

這解決了這個問題。但這是一個標準和推薦的做法嗎?

回答

5

當用戶登錄或註銷時,當前/有效訂閱將自動重新運行。

的約定是,然後打電話給在您希望出現這種情況的情況this.ready()

因爲這個客戶端:

Meteor.publish('ownedrecords', function() { 
    if (!this.userId) { 
     this.ready(); 
     return; 
    } 
    return Records.find({owner:this.userId}); 
}); 
6

你扔一個錯誤,如果用戶沒有登錄將中止訂閱,因此當用戶登錄時,他們將不再獲取更新,因爲訂閱不再有效。

所有你需要做的就是避免拋出一個錯誤。

Meteor.publish('ownedrecords', function() { 
    if (!this.userId) return []; 

    return Records.find({owner:this.userId}); 
}); 

如果返回一個空指針或火災this.ready()那麼你應該罰款。

+0

返回this.stop()是不是更好(用於內存管理)?這樣,發佈不會被創建,服務器可以釋放內存。如果你返回'[]'或'this.ready()',那麼就有一個消耗一些內存的發佈(沒有數據)。我錯了嗎? –

+0

'this.stop()'由於關閉訂閱,所以肯定會節省內存,即使發佈的遊標爲空,觀察者仍然會使用內存。我的理解是,OP希望訂閱在用戶登錄後立即返回新的相關數據,而不需要「Deps.autorun」,因此它需要保持活動狀態。 – Akshat

+0

嗯,我很困惑。由於userId來自響應環境,一旦設置了userId,它是否會使發佈再次失去活性? –

1

乾脆把

Meteor.publish('ownedrecords', function() { 
    return Records.find({owner:this.userId}); 
}); 

應導致正確的行爲,如果沒有文件有null業主。