4

私はダストテンプレートを使用していますが、デザインの1つの側面が私を悩ませてきました。これは私が「間違っている」のではないかと思うので、私は尋ねると思いました。ブロックとインラインパーシャルを使用してdust.jsに複数レベルの継承を作成する方法はありますか?レイアウト付きのベーステンプレート、一部のコンテンツをオーバーライドする継承テンプレート、および一部のコンテンツを選択的にオーバーライドすることを希望するそのテンプレートから継承するさらに別のテンプレートがあるとします。通常、最終的なオーバーライド値を提供する最後の継承テンプレートで機能すると思います。ただし、インライン部分構文は単一レベルでのみ機能するようです。これが私が話していることを示すはずの不自然な例です。

テンプレート1 test_base.dust

<h1>
{+document_title/}
</h1>
{+content}
<p>Some great content.</p>
{/content}

テンプレート2 test_level1.dust

{>test_base/}
{<document_title}Level 1{/document_title}
{<content}
<p>Other great content</p>
{/content}

テンプレート3 test_level2.dust

{>test_level1/}
{<document_title}Level 2{/document_title}

これらのテンプレートをレンダリングすると、次の結果が得られます。

dust.render('test_base', {}, function(err, data) { console.log(data); } );
"<h1></h1><p>Some great content.</p>"

dust.render('test_level1', {}, function(err, data) { console.log(data); } );
"<h1>Level 1</h1><p>Other great content</p>"

dust.render('test_level2', {}, function(err, data) { console.log(data); } );
"<h1>Level 1</h1><p>Other great content</p>"

ドキュメントを数回読みましたが、複数のレベルからテンプレートを継承できるようですが、オーバーライドできるのは1つのテンプレート定義ブロックのみです。それで、私は「それを間違っている」のでしょうか?ブロックとインラインパーシャルを使用して選択的なオーバーライドで複数レベルの継承を実現する方法はありますか?これを行い、テンプレートを乾いた状態に保つ別の方法はありますか?

4

1 に答える 1

2

残念ながら、この継承モデルはサポートされていないようです。LinkedInフォークでこのディスカッションを見つけました:https ://github.com/linkedin/dustjs/issues/101

その議論は、ドキュメントの特定の箇所を参照していました。

...インラインパーシャルはコンテンツ自体を出力することはなく、それらが定義されているテンプレートに対して常にグローバルである ため、定義の順序は重要ではありません。それらは、それらが定義されているテンプレートによって呼び出されるすべてのテンプレートに渡されます。

したがって、これについて2つの解釈があります。1つは順序が非決定的であり、テンプレートのコンパイル方法に基づいている可能性があります。2番目の潜在的な解釈は、グローバル定義は、それが定義されているテンプレートおよびテンプレートが呼び出すすべてのテンプレートに常に優先するというものです。それが正しい解釈である場合、オーバーライドしているブロックが継承階層の同じレベル以上にある場合、親テンプレートのインラインパーシャルは常に「勝ち」ます。これは私が期待することの反対であり、マルチレベルの継承にインラインパーシャルを使用することを不可能にします(少なくとも同じ名前のブロックでは)。

これは行き止まりのようですが、この動作をDustでどのように達成できるかについての他のアイデアはありますか?

于 2012-09-04T18:54:20.827 に答える