Javascript 在大项目中,如果没有闭包模板中的继承,如何生存?

Javascript 在大项目中,如果没有闭包模板中的继承,如何生存?,javascript,templates,inheritance,google-closure-templates,soy-templates,Javascript,Templates,Inheritance,Google Closure Templates,Soy Templates,我们使用闭包库和闭包编译器,并且希望使用闭包模板 但是闭包模板没有继承性。这对我们来说确实是个问题 据我所知,闭包模板之所以没有继承性,是因为模板必须简单易读 但是,在大型项目中,如果没有遗产,你怎么能生活呢 例如,我们有一个模板文件button.soy,它使用公共模板project.createButton和私有模板生成按钮:project.createOpenTag,project.createCSSClasses,project.createAttributes,project.creat

我们使用闭包库和闭包编译器,并且希望使用闭包模板

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

据我所知,闭包模板之所以没有继承性,是因为模板必须简单易读

但是,在大型项目中,如果没有遗产,你怎么能生活呢

例如,我们有一个模板文件button.soy,它使用公共模板
project.createButton
和私有模板生成按钮:
project.createOpenTag
project.createCSSClasses
project.createAttributes
project.createContent
project.createCloseTag

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

project.ButtonCircle
只需在
project.createButton
模板中进行少量更改

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

或者我们可以在button-circle.soy文件中创建公共模板
project.CreateCiscleButton
,调用其中
project.createButton
中的所有私有模板,当我们需要“覆盖”其中一个私有模板时(例如
project.CreateCssClass
),我们只需在button-circle.soy中创建新的私有模板,名称为
project.createCSSClassesCirbleButton

但是在这种情况下,我们需要将所有内容从
project.createButton
复制粘贴到
project.createCircleButton
。那太可怕了

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


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

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

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

扩展

如果一个
圆形按钮在逻辑和风格上都相同,但只是增加了功能或样式,那么组合将非常有效

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

如果一个圆圈按钮在逻辑上和风格上都不相同,只是共享一些基本元素,那么将它们提取到模板/类中并使用组合

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

{call.buttonSharedA/}
{call.buttonSharedB/}

Soy与闭包的其余部分相比,与面向对象思维的IMHO相比,它确实没有那么好,只是需要一种不同的方法。

我们只是编写预处理器,将@extends添加到Soy中。

继承不必是自动的/本地的,就可以发挥作用,也许您可以迭代源的属性/方法,并将它们复制到新的目标,而不是让它们自然地渗透;有点像javascript extend()工具与基于原型的继承。。。
<div class="circle">
  {call .buttonSharedA /}
  <span>{call .buttonSharedB /}</span>
</div>