Я оборачиваю виджет Javascript в компонент Wicket. Я хочу, чтобы сторона JS разговаривала с компонентом. Что у меня есть на данный момент:
Рассматриваемый компонент выглядит как
talker = new GridAjaxBehavior();
this.add(talker);
в конструкторе
а затем, позже, помещает что-то вроде
"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ");";
в JS.
где GridAjaxBehavior расширяет AbstractDefaultAjaxBehavior. Я хочу, чтобы GridAjaxBehavior возвращал немного XML, когда JS вызывает его.
Правильно ли я делаю это? Что должен сделать GridAjaxBehaviour, чтобы вернуть XML?
Спасибо
PSA: Wicket ~ = Java Framework. wicket.apache.org/introduction.html
пожалуйста, покажите ссылку на GridAjaxBehavior - я немного знаю калитку, но GridAjaxBehavior для меня новичок. это специально разработанное поведение



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я действительно не знаю, что такое Wicket и что он делает, но в вашем коде есть небольшая ошибка (как кажется).
Этот:
"var MyGridTalker = new talker(" + this.talker.getCallbackUrl();
Кажется, вам не хватает конечных пар:
"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ")";
В любом случае, ничего страшного, но не знал, было ли это намеренно.
Плюнуть немного XML для чего? Предположительно обновить модель или вид, да?
Сила Wicket в том, что вам не нужно беспокоиться о визуализированном HTML. В терминах модель-представление-контроллер вы настраиваете контроллер для правильного изменения модели, а Wicket заботится о представлении.
Разделение не является четким полностью: на самом деле вы можете показать / скрыть компоненты представления или изменить их, и это можно рассматривать как изменение представления.
Но обычно вам не нужно напрямую управлять браузером или javascript. Wicket позаботится об этом, если вы позаботитесь о внесении изменений в код Java.
В Wicket Ajax вызовет метод вашего AjaxBehavior с целью AjaxRequestTarget.
В этом методе (или в методах, вызываемых из него) вы делаете все, что вам нужно, обновляете модели или представления, а затем добавляете к цели любой компонент представления, который был изменен. Wicket позаботится об обновлении браузера.
Вот пример. Это взято из кода, который я сделал, но сильно изменен просто для большей ясности. Идея проста: «связанные» раскрывающиеся варианты, где параметры в дочернем элементе изменяются при изменении параметра выбора в родительском, как в серии [Штат] [Округ] [Район].
(В фактическом классе изменение модели передается дочернему элементу, который сам решает, изменилось ли оно, и добавляет себя к цели, если это так, а затем передает цель своему дочернему элементу. Я удалил большую часть этого в сделайте более ясный пример.)
Вот ctor, который просто добавляет к себе анонимный подкласс AjaxBehavior:
public AjaxChildNotifyingDropDownChoice(...code elided for clarity...) {
this.child = child;
// Ajax won't work without this:
setOutputMarkupId(true);
//
add( new OnChangeAjaxBehavior() {
@Override
public void onUpdate(final AjaxRequestTarget target) {
// tell child to update its list
// based on newly selected value
// when the Ajax is called,
// my owning component's model
// is already updated
// note we could just type getModel()
// I'm making explicit that we're calling it
// on the enclosing class
// (which a non-static inner class has a hidden ref to)
child.setNewModelBasedOnSelectionOf(
AjaxChildNotifyingDropDownChoice.this.getModel());
// now add the child to the target
// Wicket javascript will receive the new
// options and re-render the child dropdown
target.add(child);
}
});
}
Мы также могли бы иметь скрытые или не скрытые компоненты, или добавлять поведения, такие как стили CSS, или даже менять одну панель на другую. Поскольку для каждого измененного компонента мы: 1) называется setOutputMarkupId (true); чтобы javascript мог его найти, и 2) добавил его в AjaxRequestTarget
Обратите внимание, что разные типы (подклассы) Ajax Behavior имеют разные функции обратного вызова, поэтому убедитесь, что вы переопределяете правильную (добавьте аннотацию @Override, чтобы компилятор мог пожаловаться, если вы ошиблись в названии).
Но опять же, основная идея калитки заключается в том, что вместо отправки необработанных данных клиенту для анализа и действий вы обновляете свою модель и представление и говорите Wicket повторно отрисовать то, что вы изменили, добавляя измененные компоненты в цель.
Единственная причина, по которой я могу отправить прямой XML, - это передать его в javascript, не относящийся к Wicket. Дайте мне знать, если это ваша цель, и я полностью упустил суть. ;)
К вашему сведению, в вашем коде javascript есть ошибка. Вам не хватает парного знака и точки с запятой справа, но вам также не хватает кавычек вокруг предоставленной строки. ... новый говорящий (\ "" + this.talker.getCallbackURL () + "\"); "; или что-то в этом роде.