2014-03-01 6 views
0

Я хочу создать страницу, позволяющую пользователям обновлять таблицу mysql. Эта таблица может быть изменена администраторами клиентов, поэтому я должен прочитать схему таблицы и создать поля «на лету». Я получил базовый код для этого от How to create dynamic JSF form fields и код ajax от How to add ajax validation to programmatically generated primefaces component.Как добавить ajax в динамически создаваемые поля ввода полей?

Чтобы создать доказательство концепции страницы я использую следующий код (обратите внимание, я использую primefaces):

for (int idx = 1; idx < 3; idx++) { 
     UIInput input = new InputText(); 
     input.setId("text" + idx); 
     ValueExpression targetExpression = facesContext.getApplication().getExpressionFactory().createValueExpression(facesContext.getELContext(), "#{viewMakeFields.value}", String.class); 
     input.setValueExpression("value", targetExpression); 
     AjaxBehavior ab = new AjaxBehavior(); 
     ab.setAsync(true); 
     ab.setProcess("text"+idx); 
     input.addClientBehavior("blur", ab); // "change" doesn't work either 
     form.getChildren().add(input); 
    } 

Затем в поглотителе и сеттера, я получаю идентификатор компонента для идентификации какое поле изменилось:

public static String getCallingComponentID() { 
    UIComponent component = UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()); 
    return component.getId(); 
} 

public String getValue() { 
    String id = getCallingComponentID(); 
    System.out.println("getValue " + id); 
    return text1; 
} 

public void setValue(String text1) { 
    String id = getCallingComponentID(); 
    System.out.println("setValue " + id); 
    this.text1 = text1; 
} 

Аякса не стреляя, и когда я нажимаю кнопку, я получаю подать (и я знаю, смешивая частичное и полное пРЕДСТАВЛЯЕТ не хорошо):

INFO: getValue text1 
INFO: getValue text2 
INFO: getValue text1 
INFO: getValue text2 
INFO: setValue j_id1 
INFO: setValue j_id1 
INFO: getValue text1 
INFO: getValue text2 

Я вижу два возможных решения: запустите ajax, чтобы компонент, вызывающий setter, имел правильный идентификатор или получил форму submit, чтобы определить, какой ребенок вызывает setter. Первое предпочтительнее, так как я хочу отключить кнопку сохранения до тех пор, пока что-то не изменится, но я готов принять последнее на этом этапе. Любая помощь приветствуется.

+0

Я не думаю, что этот ответ относится к вам. AjaxBehavior - это конструкция JSF2, я не верю, что поддерживается в v1.x – kolossus

+0

Создание формы работает под 2.0. (Я запускаю 2.2) (Это часть этого, что работает.) Вопрос в том, как получить вызов ajax для запуска каждый раз, когда есть изменение в поле. У меня аналогичная проблема с valueChangeListener в редакторе p: editor не работает, и у меня есть обход, который является полным kludge, который может работать и здесь. Но слушатель поведения клиента кажется правильным, и мне очень хотелось бы знать, где я ошибаюсь, как это работает. – wjr

ответ

0

Оказалось, что этот код действительно работает. Где-то в моем извилистом ошибка изменилась, и я не понял ее значимости. Замена головки на h: head в файле xhtml, который я добавлял в поля, делает работу ajax.

Смежные вопросы