Калитка + Javascript - PullRequest
       16

Калитка + Javascript

4 голосов
/ 20 октября 2008

Я оборачиваю Javascript виджет в Wicket компонент. Я хочу позволить стороне JS говорить с компонентом. Что у меня так далеко:

Компонент идет как

talker = new GridAjaxBehavior();
this.add(talker);    

в конструкторе

, а затем, позже, помещает что-то вроде

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ");";

в JS.

, где GridAjaxBehavior расширяется AbstractDefaultAjaxBehavior. Я хочу, чтобы GridAjaxBehavior выплевывал некоторый XML, когда JS вызывает его

Я делаю это правильно? Что должен сделать GridAjaxBehaviour, чтобы выплюнуть XML?

Спасибо

Ответы [ 2 ]

1 голос
/ 04 апреля 2009

Приколи какой-нибудь XML для чего? Предположительно для обновления модели или вида, да?

Сила Wicket в том, что вам не нужно беспокоиться о визуализированном HTML. В терминах Model-View-Controller вы настраиваете Controller для правильного изменения модели, а Wicket заботится о представлении.

Разделение не полностью ясно: на самом деле вы можете показать / скрыть компоненты вида или затем изменить их, что можно рассматривать как изменение вида.

Но обычно вам не нужно напрямую управлять браузером или javascript. Wicket позаботится об этом, если вы позаботитесь о внесении изменений в код Java.

В Wicket Ajax вызовет метод вашего AjaxBehavior с целью AjaxRequestTarget.

В этом методе (или в вызываемых из него методах) вы делаете все, что вам нужно, обновляя модели или представления, а затем добавляете к цели любой компонент представления, который изменился. Wicket позаботится об обновлении браузера.


Вот пример. Он взят из некоторого кода, который я сделал, но сильно изменил только для того, чтобы сделать объяснение более понятным. Идея проста: «цепочечные» выпадающие варианты, где параметры в дочернем элементе изменяются при изменении параметра select в родительском элементе, как в серии [State] [County] [District].

(В реальном классе изменение модели передается дочернему элементу, который сам решает, изменился ли он, и добавляет себя к цели, если он есть, а затем передает целевой объект своему дочернему элементу. об этом, чтобы сделать более ясный пример.)

Вот 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 повторно выполнить рендеринг того, что вы изменили, добавив chnaged. компоненты к цели.

Единственная причина, по которой я могу подумать о том, чтобы отправить прямой XML, - это передать его в не-Wicket javascript. Дайте мне знать, если это ваша цель, и я полностью упустил суть. ;)

0 голосов
/ 03 апреля 2009

Я действительно не знаю, что такое Wicket или что он делает, но в вашем коде есть небольшая ошибка (как она выглядит).

Это:

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl();

Кажется, вам не хватает ваших конечных паренов:

"var MyGridTalker = new talker(" + this.talker.getCallbackUrl() + ")";

Во всяком случае, ничего страшного, но не знал, было ли это намеренно.

...