Калитка AJAX + OnComponentTag - PullRequest
       0

Калитка AJAX + OnComponentTag

2 голосов
/ 26 июля 2010

Привет, ребята, я хотел добавить событие AJAX на мою домашнюю страницу, но оно не работает!Я понял, что если я удаляю функцию onComponentTag, она работает хорошо.Я понятия не имею, почему это случилось, может быть, вы можете мне помочь!Вот мой код:

  final TextField<String> searchInput = new TextField<String>("searchInput", model) {

    @Override
    protected void onComponentTag(final ComponentTag tag) {
     super.onComponentTag(tag);
     tag.put("id", this.getId());
     if (params.getString("search") != null) {
      tag.put("value", params.getString("search"));
     }
    }
   };

   searchInput.add(new AjaxFormComponentUpdatingBehavior("onfocus") {
    @Override
    protected void onUpdate(final AjaxRequestTarget target) {
     System.out.print("never saw that message :(");
     searchInput.setDefaultModelObject("");
     target.addComponent(searchInput);
    }

   });

Спасибо за помощь!CU

Ответы [ 2 ]

5 голосов
/ 27 июля 2010

Во-первых, вам вообще не нужно переопределять onComponentTag (). Как утверждает seanizer, если вашему действительно необходимо указать идентификатор разметки самостоятельно, используйте setMarkupId (id). Вы должны понимать, почему рекомендуется, чтобы Wicket управлял идентификаторами компонентов.

Во-вторых, добавляемый вами атрибут value не нужен - Wicket добавляет его автоматически для этого компонента. Присвоенное значение является значением объекта модели компонента. См. Источник для TextField.onComponentTag ().

В-третьих, опять же, как утверждает seanizer, компоненты, которые должны обновляться с помощью ajax, должны выводить свои идентификаторы разметки - реализация ajax от Wicket использует идентификатор в качестве селектора для элемента. Кроме того, все поведения Ajax Wicket, которые расширяют AbstractDefaultAjaxBehavior, автоматически устанавливают outputMarkupId (true) для компонента, с которым они связаны (см. Источник для AbstractDefaultAjaxBehavior.onBind ()). Это включает в себя AjaxFormComponentUpdatingBehavior.

Итак:

String id = "searchInput";
final TextField<String> searchInput = new TextField<String>(id, model);
searchInput.setMarkupId(id);

searchInput.add(new AjaxFormComponentUpdatingBehavior("onfocus") {
  @Override
  protected void onUpdate(final AjaxRequestTarget target) {
    System.out.print("never saw that message :(");
    searchInput.setDefaultModelObject("");
    target.setOutputMarkupId(true);
    target.addComponent(searchInput);
  }
});

Наконец, я бы задал вопрос, чего вы на самом деле пытаетесь достичь с помощью этого поведения. Я не вижу смысла отправлять это событие на сервер. Конечно, какой-нибудь JS на стороне клиента более уместен?

5 голосов
/ 26 июля 2010
tag.put("id", this.getId());

- это не способ сделать это в калитке.

Вместо этого используйте

component.setOutputMarkupId(true)

(либо в конструкторе компонента, либо в методе bind () вашего поведения) дляЗаставьте wicket написать идентификатор, и если вам абсолютно необходимо контролировать, что это за идентификатор (а это почти всегда так), вы также можете сделать

component.setMarkupId("myId")

, вам, вероятно, не следует присваивать значение тега самостоятельно,используйте модель (в калитке обработка модели очень умна, читайте подробнее о моделях ).Существуют допустимые варианты использования onComponentTag, но они намного превосходят то, что вы делаете.Позвольте калитке делать то, что лучше всего, и все будет хорошо.


РЕДАКТИРОВАТЬ: ОК, еще уточнения

взгляните на исходный код AjaxFormComponentUpdatingBehavior особенно в той части, где генерируется обработчик событий javascript.

protected final CharSequence getEventHandler()
{
    return generateCallbackScript(
                    new AppendingStringBuffer("wicketAjaxPost('")
                    .append(getCallbackUrl(false)).append(
        "', wicketSerialize(Wicket.$('" 
                         + getComponent().getMarkupId() + "'))"));
}

, как вы можете видеть, wicket использует getMarkupId () для определения фактического идентификатора.Идентификатор, который вы устанавливаете с помощью tag.put (id), совершенно неизвестен калитке, и, следовательно, поведение не может работать.

Стандартным способом является setOutputMarkupId (true).Это единственный правильный способ сообщить калитке, что нужно визуализировать идентификатор (кроме setOutputMarkupPlaceholder (true), который внутренне вызывает первый метод).Таким образом, вы можете быть уверены, что id wicket пишет то, о чем знает wicket.Если это не отображает идентификатор, вы, вероятно, нарушаете поведение по умолчанию, перезаписывая onComponentTag.

Посмотрите на исходный код компонента , особенно на 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 и отправьте сообщение об ошибке.Но я сомневаюсь, что это стандартная функциональность, которая работает для тысяч пользователей.

...