Гобелен 5.2: Обновление зоны с данными из формы - PullRequest
2 голосов
/ 21 декабря 2010

Я играю с гобеленом 5.2.4 и AJAX.

В моем Test.tml есть форма:

<form t:id="form">
   <t:label for="userName"/>:
   <input t:type="TextField" t:id="userName" size="30"/>
</form>

И зона, в которой отображается переменная «test»:

<t:zone t:id="myZone" id="myZone">
    <p>show test ${test}</p>
</t:zone>

Теперь я пытаюсь поместить значение поля формы "userName" в зону с помощью actionlink:

<t:actionlink t:id="SomeLink" zone="myZone" context="${userName}">update</t:actionlink>

Вот класс Java Test.java:

public class Test {

    @Persist
    @Property
    private String userName;

    @Property
    private String test;
    @InjectComponent
    private Zone myZone;

    @Component
    private Form form;

    Object onActionFromSomeLink(String input) {
        test = input;
        return myZone.getBody();
    }   
}

Я думал, что это "примет" значение поля формы userName и передаст его с помощью actionlink методу onActionFromSomeLink. Метод устанавливает переменную «test» для ввода, и зона отображается.

Это не работает и выдает ошибку, которую я не понимаю:

Ошибка Ajax: Состояние 500 для /example/test.somelink: Событие запроса 'action' (для компонента Test: somelink) не было обработано; Вы должны предоставить соответствующий метод обработчика событий в компоненте или в одном из его контейнеров.

Communication with the server failed: Request event 'action' (on component Test:somelink) was not handled; you must provide a matching event handler method in the component or in one of its containers.

Как я могу реализовать функцию, которая принимает данные из формы, а затем обновляет зону?

Приветствия

1 Ответ

7 голосов
/ 21 декабря 2010

Вы используете не тот компонент. ActionLink отображает ссылку HTML, она вообще не взаимодействует с формами. Хотя вы можете указать ссылку context, она абсолютно статична и не извлекает значения из форм на стороне клиента. (context полезен в основном для различения объектов, если у вас есть где-то список элементов со ссылкой, каждый из которых что-то с ними делает.)

То, что вы пытаетесь сделать, это отправить форму и обновить ее зону. Вам нужно будет добавить параметр zone в компонент формы и добавить что-то, что позволит вам отправить форму:

<form t:id="form" t:zone="myZone">
    <t:label for="userName"/>:
    <input t:type="TextField" t:id="userName" size="30"/>
    <input type="submit" t:type="Submit" />
</form>

А в вашем классе:

@Inject
private Request request;

@OnEvent(EventConstants.SUCCESS)
Object formSubmitted(){
    //return zone content only if AJAX request, page otherwise
    if (request.isXHR()) {
        return myZone.getBody();
    } else {
        return this;
    }
}

Если вы действительно хотите использовать ссылку для отправки формы, компонент LinkSubmit также позволяет вам сделать это.

...