在大项目中如何在闭包模板中没有继承?

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。