Нет необходимости копировать какие-либо функции TextField
в вашем собственном компоненте, вместо этого вы должны создать компонентный миксин. Миксины предназначены для добавления поведения к существующим компонентам.
Из Гобелен 5 документов :
Гобелен 5 включает в себя радикальную функцию,
Компоненты миксинов. Компоненты миксинов
хитрая концепция; это в основном позволяет
настоящий компонент для смешивания
со специальными ограниченными компонентами под названием
Примеси. Компонент плюс его миксин
представлены как один тег
в шаблоне компонента, но все
поведение всех элементов.
Вы бы использовали миксин так:
<input type="text" t:type="TextField" t:mixins="MyMixin" t:someParam="foo" />
Заглушка миксина:
@IncludeJavaScriptLibrary("MyMixin.js")
public class MyMixin {
/**
* Some string param.
*/
@Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
private String someParam;
@Environmental
private RenderSupport renderSupport;
@InjectContainer
private AbstractTextField field;
@AfterRender
void addScript() {
this.renderSupport.addScript("new MyJavascriptClass('%s', '%s');",
this.field.getClientId(), this.someParam);
}
}
Обратите внимание на аннотацию @InjectContainer
, которая вставляет содержащий TextField в ваш Mixin. В этом случае нам нужен идентификатор клиента TextField.
Также обратите внимание на аннотацию @IncludeJavaScriptLibrary("MyMixin.js")
, которая включает необходимый файл Javascript.
Javascript может выглядеть так:
MyJavascriptClass = Class.create({
initialize: function(textField, someParam)
{
this.textField = $(textField);
this.someParam = someParam;
this.textField.observe('focus', this.onFocus.bindAsEventListener(this));
},
onFocus: function(event)
{
//do something
}
}
Ключевым отличием вашего подхода является то, что он включает определение собственного класса JS и использование встроенных средств Tapestry для загрузки и инициализации JS. Использование миксинов также относительно легкое и элегантное по сравнению с созданием ваших собственных компонентов.