tag.put("id", this.getId());
это не способ сделать это в калитке.
вместо этого используйте
component.setOutputMarkupId(true)
(либо в конструкторе вашего компонента, либо в методе bind() вашего поведения), чтобы калитка записывала идентификатор, и если вам абсолютно необходимо контролировать, что такое идентификатор (что почти никогда не бывает), вы можете сделать
component.setMarkupId("myId")
Кроме того, вам, вероятно, не следует назначать значение тега самостоятельно, используйте модель (обработка модели чрезвычайно умна в калитке, читайте подробнее о моделях). Существуют допустимые варианты использования onComponentTag, но они выходят далеко за рамки того, что вы делаете. Пусть калитка делает то, что калитка делает лучше всего, и все будет хорошо.
РЕДАКТИРОВАТЬ: ОК, еще одно уточнение
взгляните на исходный код AjaxFormComponentUpdatingBehavior, особенно часть, где создается обработчик событий javascript.
protected final CharSequence getEventHandler()
{
return generateCallbackScript(
new AppendingStringBuffer("wicketAjaxPost('")
.append(getCallbackUrl(false)).append(
"', wicketSerialize(Wicket.$('"
+ getComponent().getMarkupId() + "'))"));
}
как видите, калитка использует getMarkupId() для определения фактического идентификатора. Идентификатор, который вы установили с помощью tag.put(id), совершенно неизвестен калитке, и поэтому поведение не может работать.
Стандартная вещь — setOutputMarkupId(true). Это единственный правильный способ указать калитке отображать идентификатор (кроме setOutputMarkupPlaceholder(true), который внутренне вызывает первый метод). Таким образом, вы убедитесь, что id wicket пишет, что id wicket знает о нем. Если это не отображает идентификатор, вы, вероятно, нарушаете какое-то поведение по умолчанию, перезаписывая onComponentTag.
Взгляните на исходный код Component, особенно onComponentTag(), метод, который вы переопределяете:
protected void onComponentTag(final ComponentTag tag) {
// if(setOutputMarkupId(true) was set)
if (getFlag(FLAG_OUTPUT_MARKUP_ID)) {
// set id attribute
tag.put(MARKUP_ID_ATTR_NAME, getMarkupId());
}
}
[Комментарии мои. Кстати, это источник древней версии, но я не нашел ни одного актуального источника в Интернете, и функциональность не изменилась.]
Теперь, если, как и в вашем случае, вы хотите установить идентификатор компонента вручную, вы должны использовать
component.setMarkupId("myId")
и конечно
setOutputMarkupId(true)
также. Если это не сработает, перейдите на сайт калитки JIRA и сообщите об ошибке. Но сомневаюсь, это стандартный функционал, который работает у тысяч пользователей.
person
Sean Patrick Floyd
schedule
26.07.2010