1

クライアント側とサーバー側の両方で使用したい「部分的な」テンプレートがあります。

includeテンプレートをすぐに実行する代わりに、クライアントでコンパイルされた関数を返し、それをJS変数に割り当ててスクリプト全体で使用できることを除いて、非常によく似たメソッドやフィルターなどはありますか?

現在、私はこれを行っています:

exports.list = function(req, res){
    res.render('file/list', {
        ...
        fileItemTemplate: jade.compile(fs.readFileSync(path.join(req.app.get('views'),'file','file-item.jade')), {client: true})
    });
};

そして、私のテンプレートには次のものがあります。

ul#folder-list.thumbnails
    each file in files
        include file-item

...

script(type='text/javascript')
    var fileItemTemplate = !{fileItemTemplate};

このようにして、ページの読み込み時にいくつかのアイテムをHTMLにレンダリングし、データが入ってくるときにパーシャルをレンダリングすることで、後でさらにいくつかのアイテムを追加できます。

これは機能しますが、ファイルを読み込んでルート内のファイルパスなどを処理し、基本的にまったく同じ変数をクライアント側で再宣言する必要があるため、あまり乾燥しているとは感じません。

これを行う良い方法はありますか?

このようなものが理想的です:

script(type='text/javascript')
    var fileItemTemplate = !{compile file-item};
4

1 に答える 1

1

可能な解決策はJadeAssetです。こちらの議論も参照してください。

アセットを Express にフックできます。

assets.on('complete', function() {
    var app = express.createServer();
    app.configure(function() {
        app.use(assets);  // that's all you need to do
    });
    app.listen(8000);
});

Jade アセットを作成するには:

var assets = new AssetRack([
    new rack.JadeAsset({
        url: '/templates.js',
        dirname: __dirname + '/templates'
    })
]);
于 2013-01-01T20:06:23.510 に答える