2012-11-15 2 views
0

Ответ на следующий вопрос показывает, что это возможно:Определение дополнительных параметров виджета с UiBinder

Trying to get UIBinder to give me a span not a div

Если вы объявляете <g:HTMLPanel tag="span"> в шаблоне, то HTMLPanel будет <span> элементом в финале результат, а не по умолчанию <div>.

HTMLPanel имеет этот конструктор:

public HTMLPanel(String tag, String html) 

, который, вероятно, вызывается этот метод, но как? Если нет атрибута тега в шаблоне, то конструктор используется, вероятно, это один:

public HTMLPanel(String html) 

Я понимаю, что можно аннотировать конструктор с @UiConstructor создать виджет с параметрами, определенными в шаблоне, но как можно изменять конструкторы в зависимости от того, какие атрибуты определены?

А также, как заполняется String html? Будет ли какое-то неявное определение атрибута html в качестве содержимого элемента? Или это нестандартное поведение UIBinder только для HTMLPanel?

ответ

1

HTMLPanel имеет специальный HTMLPanelParser, который обрабатывает элемент из ui.xml.

Элемент парсеров является внутренней частью UiBinder, вы не можете add your own.

Вы должны объявить один @UiConstructor конструктора и остальные заботятся сеттерами, с некоторой окончательной проверки возможно сделать в onAttach (подобно тому, как Composite бросает в приложить время, когда вы забыли позвонить initWidget и аналогично для Widget и setElement).

В сложных случаях и/или если вы хотите использовать аргументы конструктора, то не делайте ничего особенного и у пользователей виджета используйте @UiFactory или @UiField(provided = true). Это уже имеет место для SuggestBox, ValueListBox или CellList, например.

Мои личные предпочтения относятся к этому последнему подходу.

Смежные вопросы