本文翻译出处 http://tapestry.apache.org/tapestry5/tapestry-core/guide/mixins.html
本人翻译目的是用来学习Tapestry5的,共享出来希望大家批评指正。计划持续翻译。
chinajavawolf
组件混合
Tapestry5
有一个重要的创新的特性,组件混合是一个复杂的概念。他的本质是允许一个真实的组件被一些特殊的有限的组件结合在一起,这被称为混合。在组件模板里组件加上他的混合组件的所有元素的所有行为被描绘成一个单独的标签。
这个方案是用来将验证加到用户输入栏或者加上
Ajax
效果和行为给所有组件。
你可以把混合组件看作一类柔和在一起的组件,他结合组件行为和混合组件行为,并且把他们捆在一处。
组件混合被用在两个不同的场合:实例混合和执行混合。
混合类
混合类被放在一个
mixins
子包里,在应用(或者库)的根目录下。与组件和页面类被存储在同一级目录下。
除了这个,混合类和其他任何组件类都是一样的。
混合限制
目前,混合组件被允许去做任何组件可以做的事情,包括参数、程现阶段的方法。
混合组件可以没有模板。他们根据调用地呈现阶段方法和组件结合。
混合组件可以有持久化属性,但是目前,这没有完全被实现(混合组件和组件或和其他混合组件可能存在命名冲突)。使用混合组件的持久化属性要谨慎,更好的是,使用容器参数代替它。
混合组件是不能混合自身的。
实例混合
实例混合是一个应用于特定组件实例上的混合。这可以通过
<comp></comp>
元素的混合属性被应用在组件模板中。这是一个用逗号分隔的混合名字列表。
另一个方案,当组件标注被用来定义一个组件类型时,你可以用两种方法制定混合:
-
Mixins 标注允许指定一个混合名字的列表。
-
MixinClasses 标注允许直接指定一组混合类。 s
前者常用来减少冗余,并且允许使用特定应用混合来代替核心混合。后者是一个更明确更友好的重构格式(
重新命名的混合类也将会重新命名 MixinClasses 注解的项目
)
例如
:
- @Component(parameters=. . .) @Mixins({"Autocomplete", "DefaultFromCookie"})
- private TextField _userId;
执行混合
执行混合,混合应用于所有组件实例,被附加使用
Mixin
标注。这个标注定义的
field
将包含混合实例。
- public class AutocompleteField extendes TextField
- {
- @Mixin
- private Autocomplete _autocompleteMixin;
- . . .
- }
通常,这个
field
的类型是一个精确的要被实例化的混合类。
在其他场合,例如,当
field
的类型是一个接口或者是一个基类,标注的属性值将被用来确定混合类的名字。
- public class AutocompleteField extendes TextField
- {
- @Mixin("Autocomplete")
- private Object _autocompleteMixin;
- . . .
- }
混合参数
混合允许有参数,就像组件一样。
当绑定参数时(或者在模板中使用组件标注的参数属性)
Tapestry 将会匹配每个叁数名对应的每个被类定义的叁数(说的是哪个,组件和每个混合组件)
如果组件和混合组件定一个了一个同名参数,那么使用组件的参数。组件参数将被绑定,并且混合组件的参数将被解除绑定。
另外,你可以使用混合类的绝对名作为参数的前缀名。这可以去除不明确的情况,例如:
java 代码
- @Component(parameters={"Autocomplete.id=auto", . . . }) @Mixins("Autocomplete", "DefaultFromCookie"})
- private TextField _userId;
呈现阶段排序
所有对于组件的混合执行他们呈现阶段方法是在这个组件多数的呈现阶段方法之前。在最后阶段
(AfterRender, CleanupRender)
执行顺序反过来。
此外:混合使用
MixinAfter
标注的类排在组件之后。不是之前。