在大项目中如何在闭包模板中没有继承?
How can live without inheritance in closure templates in big project?
我们使用闭包库和闭包编译器,我们想使用闭包模板。
但是闭包模板没有继承。这对我们来说真的是个问题。
据我了解,闭包模板之所以没有继承,是因为模板必须简单易读。
可是大项目没有继承怎么活呢?
例如,我们有一个模板文件button.soy生成带有public模板project.createButton
和私有模板的按钮:project.createOpenTag_
, project.createCSSClasses_
, project.createAttributes_
, project.createContent_
, project.createCloseTag_
.
我们有JavaScriptclassproject.Button
,我们有project.ButtonCircle
(也许这个单独的classproject.ButtonCircle
似乎没有必要,但它是只是一个例子)扩展了 project.Button
.
project.ButtonCircle
需要对 project.createButton
模板进行少量更改。
当然我们可以为 project.createButton
添加新功能,但这是一个非常糟糕的主意,因为这种方法将来会创建怪物模板。
或者我们可以在文件 button-circle.soy 中创建 public 模板 project.createCircleButton
,从 project.createButton
调用所有私有模板在其中,当我们需要 'override' 这些私有模板之一时(例如 project.createCSSClasses_
),我们只需在 button-circle.soy[= 中创建新的私有模板56=] 名称为 project.createCSSClassesCirbleButton_
.
然而在这种情况下,我们需要将所有内容从 project.createButton
复制粘贴到 project.createCircleButton
。太可怕了。
我们也尝试过使用委托模板,但它不适合继承。
解决这个问题的方法是什么?
我会隔离每个通用模板 functions/element 并使用工厂模块构建模板。每个模板都是由几个小元素和功能组合而成。
很难收集到你的确切用例,但我在 Google 期间广泛使用了 soy/closure 我很理解你的困惑,因为它们不是我最喜欢的。我同意@Francois-Richard 关于保持通用模板非常小并将多个模板组合在一起的一般建议。大豆模型(以及我坦率使用过的许多其他 JS 模板系统)强烈支持组合而不是继承。
分机
如果 CircleButton
在逻辑上和风格上相同,但只是增加了功能或样式,那么合成效果会很好。
<div class="circle">
{call .button}
</div>
参数化
如果CircleButton
在逻辑上相同但在风格上不同,为什么不允许Button
按形状参数化并重复使用相同的模板?
{call .button shape="circle" /}
作文
如果 CircleButton
在逻辑上和风格上都不相同,而只是共享一些基本元素,则将它们提取到 templates/classes 并使用组合。
<div class="circle">
{call .buttonSharedA /}
<span>{call .buttonSharedB /}</span>
</div>
相对于 OO 思维恕我直言,Soy 确实与其余的闭包不协调,只是需要一种不同的方法。
我们只是编写预处理器,将@extends 添加到 soy。
我们使用闭包库和闭包编译器,我们想使用闭包模板。
但是闭包模板没有继承。这对我们来说真的是个问题。
据我了解,闭包模板之所以没有继承,是因为模板必须简单易读。
可是大项目没有继承怎么活呢?
例如,我们有一个模板文件button.soy生成带有public模板project.createButton
和私有模板的按钮:project.createOpenTag_
, project.createCSSClasses_
, project.createAttributes_
, project.createContent_
, project.createCloseTag_
.
我们有JavaScriptclassproject.Button
,我们有project.ButtonCircle
(也许这个单独的classproject.ButtonCircle
似乎没有必要,但它是只是一个例子)扩展了 project.Button
.
project.ButtonCircle
需要对 project.createButton
模板进行少量更改。
当然我们可以为 project.createButton
添加新功能,但这是一个非常糟糕的主意,因为这种方法将来会创建怪物模板。
或者我们可以在文件 button-circle.soy 中创建 public 模板 project.createCircleButton
,从 project.createButton
调用所有私有模板在其中,当我们需要 'override' 这些私有模板之一时(例如 project.createCSSClasses_
),我们只需在 button-circle.soy[= 中创建新的私有模板56=] 名称为 project.createCSSClassesCirbleButton_
.
然而在这种情况下,我们需要将所有内容从 project.createButton
复制粘贴到 project.createCircleButton
。太可怕了。
我们也尝试过使用委托模板,但它不适合继承。
解决这个问题的方法是什么?
我会隔离每个通用模板 functions/element 并使用工厂模块构建模板。每个模板都是由几个小元素和功能组合而成。
很难收集到你的确切用例,但我在 Google 期间广泛使用了 soy/closure 我很理解你的困惑,因为它们不是我最喜欢的。我同意@Francois-Richard 关于保持通用模板非常小并将多个模板组合在一起的一般建议。大豆模型(以及我坦率使用过的许多其他 JS 模板系统)强烈支持组合而不是继承。
分机
如果 CircleButton
在逻辑上和风格上相同,但只是增加了功能或样式,那么合成效果会很好。
<div class="circle">
{call .button}
</div>
参数化
如果CircleButton
在逻辑上相同但在风格上不同,为什么不允许Button
按形状参数化并重复使用相同的模板?
{call .button shape="circle" /}
作文
如果 CircleButton
在逻辑上和风格上都不相同,而只是共享一些基本元素,则将它们提取到 templates/classes 并使用组合。
<div class="circle">
{call .buttonSharedA /}
<span>{call .buttonSharedB /}</span>
</div>
相对于 OO 思维恕我直言,Soy 确实与其余的闭包不协调,只是需要一种不同的方法。
我们只是编写预处理器,将@extends 添加到 soy。