10

我们使用闭包库和闭包编译器,我们想使用闭包模板。

但是闭包模板没有继承。这对我们来说确实是个问题。

据我了解,闭包模板没有继承的原因是因为模板必须简单且易于阅读。

但是在大项目中没有继承怎么能活呢?

例如,我们有一个模板文件button.soyproject.createButton ,它使用公共模板和私有模板生成按钮: project.createOpenTag_, project.createCSSClasses_, project.createAttributes_, project.createContent_, project.createCloseTag_

我们有 JavaScript 类project.Button,并且我们有project.ButtonCircle(也许这个单独的类project.ButtonCircle似乎没有必要,但这只是一个示例)扩展了project.Button.

project.ButtonCircleproject.createButton需要对模板进行少量更改。

当然我们可以添加新的功能project.createButton,但这是一个非常糟糕的主意,因为这种方法将来会创建怪物模板。

或者我们可以project.createCircleButton在文件button-circle.soy中创建公共模板,从中调用所有私有模板project.createButton,当我们需要“覆盖”这些私有模板之一时(例如project.createCSSClasses_),我们只需在button-中创建新的私有模板- circle.soy的名字project.createCSSClassesCirbleButton_

然而在这种情况下,我们需要将所有内容从 复制粘贴project.createButtonproject.createCircleButton。这太可怕了。

我们也尝试使用委托模板,但它不适合继承。

解决这个问题的方法是什么?

4

3 回答 3

2

很难收集您的确切用例,但在我在 Google 工作期间广泛使用大豆/封闭物后,我对您的困惑表示同情,因为它们不是我最喜欢的。我同意@Francois-Richard 的一般建议,即保持通用模板非常小并将多个模板组合在一起。soy 模型(以及我坦率使用的许多其他 JS 模板系统)强烈支持组合而不是继承。

延期

如果 aCircleButton在逻辑上和风格上是相同的,但只是增加了功能或样式,那么组合就会很好用。

<div class="circle">
  {call .button}
</div>

参数化

如果 aCircleButton在逻辑上相同但风格不同,为什么不允许Button按形状参数化并重用相同的模板?

{call .button shape="circle" /}

作品

如果 aCircleButton在逻辑上和风格上都不相同,而只是共享一些基本元素,则将它们提取到模板/类并使用组合。

<div class="circle">
  {call .buttonSharedA /}
  <span>{call .buttonSharedB /}</span>
</div>

相对于面向 OO 思维的恕我直言,Soy 的其余部分的关闭确实不太好,只需要一种不同的方法。

于 2015-10-01T22:03:15.413 回答
0

我会隔离每个常见的模板功能/元素并使用工厂模块构建模板。每个模板都是由几个小元素和功能组成的。

于 2015-10-01T16:11:07.060 回答
0

我们只需编写预处理器,将@extends 添加到大豆。

于 2016-05-26T16:12:39.373 回答