2013-10-30 35 views
0

我很難理解如何將從數據庫中提取的對象傳遞到dust.js模板。將異步對象傳遞給dustjs模板

比方說,我有一個模板:

{#person} 
{name} - {title} 
{/person} 

我嘗試設置一個背景是這樣的:

var ctx = { 
    person: return chunk.map(function(chunk) { 
     database.person(12345, function(data) { 
      dust.nextTick(function() { 
        chunk.end(data); // What to really do here? 
      }); 
     }); 
    }); 
} 

凡database.person從數據庫中獲取的對象,並將其傳遞到回電話。

然後,我會跑渲染功能:

res.render('person', ctx); 

回答

1

正確的形式是:

var ctx = { 
    person: function(chunk, context, bodies) { 
     return chunk.map(function(chunk) { 
      database.person(1234, function(data) { 
       return chunk.render(bodies.block, context.push(data)).end(); 
      }); 
     }); 
    } 
} 

而是寫的我不得不打電話呈現在艾倫的回答。

整個db調用必須包含在return chunk.map調用中才能工作。我還必須鏈接一個結束命令才能將結果發送迴流。

爲什麼需要這些調用在dust.js指南(http://akdubya.github.io/dustjs/#guide)被告知:

chunk.map告訴灰塵製造新的塊,在 預留插槽上繼續之前的輸出流渲染其餘的 模板。您必須(最終)調用映射塊上的chunk.end()到 將其內容重新編排到流中。

這是在LinkedIn指南頁面中未提及的。

+0

在調用res.render並將其作爲上下文的一部分傳遞之前,應該先調用db調用。 – Trevor

0

我假設你的數據庫調用將返回沿一個JSON對象線的東西,如「數據」下面。

異步代碼看起來沒問題。 chunk.write只會寫出你提供的任何內容,所以你需要在上下文中傳遞數據,以便在模板中進行訪問。使用chunk.render而不是寫入。一個非異步的例子是:

{ 
    "person": function(chunk, context, bodies) { 
     var data = {name:"Smith", title:"Mr"}; 
     return chunk.render(bodies.block, context.push(data)); 
    } 
} 

運行,通過linkedin dust tests似乎得到正確的答案。

希望幫助, 艾倫

+0

謝謝你,艾倫!你的回答引導我朝着正確的方向前進。我必須將db調用包裝爲chunk.map(...),並將.end()鏈接到render函數的末尾。 – villetou