2015-05-21 57 views
0

在客戶端啓動我訂閱的東西:如何處理模板呈現但數據尚未準備好的情況?

Meteor.publish("Roles", function(){ 
    return Roles.find(); 
}); 

Meteor.startup(function() { 
    if(Meteor.isClient) { 
    Meteor.subscribe('Roles'); 
    } 
}); 

和角色的模板:

Template.roles.helper(function() { 
    allRoles: function() { 
    return Roles.find().fetch(); 
    } 
}) 

<template name="roles"> 
    <div> 
    {{#with allRoles}} 
     <label>{{> role }}</label> 
    </div> 
</template> 

的問題是有時roles模板呈現前Roles已準備就緒。

如何處理這種情況?

回答

2

你可以做模板上的訂閱,然後使用Template.subscriptionReady幫助創造條件,以顯示加載面板,而你的訂閱正在加載如下:

Template.roles.onCreated(function() { 
    this.subscribe("Roles"); 
}); 

Template.roles.helper(function() { 
    allRoles: function() { 
    return Roles.find().fetch(); 
    } 
}) 

<template name="roles"> 
    <div> 
    {{#if Template.subscriptionsReady}} 
     {{#with allRoles}} 
     <label>{{> role }}</label> 
    {{else}} 
     Loading... 
    {{/if}} 
    </div> 
</template> 

這將替換您的其他訂閱這些可以爲每個模板的每個onCreated方法添加訂閱,以便爲每個模板訂閱訂閱。

+0

這有效,但我會在幾個地方(網址)使用這個角色模板,所以每次在這些網址之間切換時,角色模板都會被創建並訂閱「角色」,服務器將發佈「角色」每次。但角色集合只需要發佈一次,因爲角色的內容是固定的。我該如何解決這個問題? – Sato

+1

你的路線怎麼樣? –

+0

使用'鐵路由器',但我不想使用'waitOn',因爲在每條路由中,我必須寫相同的'waitOn:function(){return Meteor.subscribe('Roles');}'。 – Sato

0

有一些常見的方式來處理它。您可以使用警衛或使用鐵路路由器的waitOn功能。隨着保護你只能從助手,如果你得到任何結果返回數據:

allRoles: function() { 
    var roles = Roles.find(); 
    //explicit version 
    if (roles.count()) return roles 

    //implicitly works as well here because you're returning null when there are no results 
    return roles 
} 

你不需要在這種情況下,取(),因爲#with用遊標工作。如果遇到需要首先獲取的情況,因爲您要返回部分數據,請檢查是否有結果,然後才能返回結果。

您也可以使用鐵路路由器waitOn如果您將此作爲路線的一部分使用,請選擇此選項。

相關問題