2012-09-04 32 views
4

我使用防尘模板,设计的一个方面一直在困扰着我。这让我想知道我是否“做错了”,所以我想我会问S.O.有没有办法用block和inline partials在dust.js中创建多级继承?假设你有一个带有布局的基本模板,一个覆盖某些内容的继承模板,然后是另一个模板继承自希望有选择地覆盖某些内容的模板。通常我会想象它可以通过最后一个继承模板提供最终的覆盖值。但是,内联部分语法似乎只能在单个级别上工作。这是一个人为的例子,应该显示我在说什么。有没有办法做多个级别的继承值覆盖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>" 

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

回答

2

不幸的是,它看起来像这个继承模型不支持。发现了LinkedIn叉讨论:https://github.com/linkedin/dustjs/issues/101

这种讨论中引用在文档中特定的一段话:

...在线谐音从来输出内容 自己,始终是全局的模板中,他们被定义为 所以它们的定义顺序没有意义。它们被传递给由 所调用的所有模板,在这些模板中定义了它们。

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

看起来像这样是一个死胡同,关于如何在尘埃中完成这种行为的任何其他想法?

相关问题