0

データベースから取得したオブジェクトを Dust.js テンプレートに渡す方法を理解するのに苦労しています。

テンプレートがあるとしましょう:

{#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);
4

2 に答える 2

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();
            });
        });
    }
}

書く代わりに、アランの答えのように render を呼び出さなければなりませんでした。

機能するためには、db 呼び出し全体を return chunk.map 呼び出しで囲む必要がありました。また、結果をストリームに送り返すために end コマンドをチェーンする必要がありました。

これらの呼び出しが必要な理由は、dust.js ガイド ( http://akdubya.github.io/dustjs/#guide ) で説明されています。

chunk.map は、テンプレートの残りのレンダリングを続行する前に、出力ストリームにスロットを予約して、新しいチャンクを作成するように Dust に指示します。(最終的に) マップされたチャンクで chunk.end() を呼び出して、コンテンツをストリームに戻す必要があります。

これは、LinkedIn のガイド ページで取り上げられていないものです。

于 2013-10-31T07:33:58.290 に答える
0

あなたの db 呼び出しは、以下の「データ」などの json オブジェクトの行に沿って何かを返すと想定しています。

非同期コードは問題ないようです。chunk.write は、与えられたものをすべて書き出すだけなので、テンプレートでアクセスできるように、コンテキストでデータを渡す必要があります。write の代わりに chunk.render を使用します。非非同期の例は次のようになります。

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

それをリンクされたダストテストで実行すると、正しい答えが得られるようです。

お役に立てば幸いです、アラン

于 2013-10-30T22:39:16.240 に答える