Я хочу создать страницу, позволяющую пользователям обновлять таблицу 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. Первое предпочтительнее, так как я хочу отключить кнопку сохранения до тех пор, пока что-то не изменится, но я готов принять последнее на этом этапе. Любая помощь приветствуется.
Я не думаю, что этот ответ относится к вам. AjaxBehavior - это конструкция JSF2, я не верю, что поддерживается в v1.x – kolossus
Создание формы работает под 2.0. (Я запускаю 2.2) (Это часть этого, что работает.) Вопрос в том, как получить вызов ajax для запуска каждый раз, когда есть изменение в поле. У меня аналогичная проблема с valueChangeListener в редакторе p: editor не работает, и у меня есть обход, который является полным kludge, который может работать и здесь. Но слушатель поведения клиента кажется правильным, и мне очень хотелось бы знать, где я ошибаюсь, как это работает. – wjr