4

我正在使用灰尘模板,设计的一个方面一直困扰着我。这让我想知道我是否“做错了”,所以我想我会问 SO 有没有办法在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>"

我已经阅读了几次文档,但似乎您可以从多个级别继承模板,但您只能覆盖单个模板定义的块。那我是不是“做错了”?有没有办法通过使用块和内联部分的选择性覆盖来完成多级继承?还有其他方法可以做到这一点并保持模板干燥吗?

4

1 回答 1

2

不幸的是,似乎不支持这种继承模型。在linkedin fork上找到了这个讨论:https ://github.com/linkedin/dustjs/issues/101

该讨论引用了文档中的特定段落:

...内联部分从不输出内容本身,并且对于定义它们的模板始终是全局的, 因此它们的定义顺序没有意义。它们被传递给定义它们的模板调用的所有模板。

所以我对此有两种解释:一种顺序是不确定的,可能基于模板的编译方式。第二种可能的解释是全局定义总是取代定义它的模板和模板调用的任何模板。如果这是正确的解释,那么如果父模板中的内联部分覆盖的块在继承层次结构中处于同一级别或更高级别,则它们将始终“获胜”。这与我所期望的相反,并且使得使用内联部分进行多级继承是不可能的(至少使用相同的命名块)。

似乎这是一个死胡同,关于如何在 Dust 中实现这种行为的任何其他想法?

于 2012-09-04T18:54:20.827 回答