Динамически созданные компоненты ввода не показывают значения модели
У меня есть несколько полей компонента, которые мне нужно показать программно. Это что-то вроде этого:
HtmlPanelGrid panel = new HtmlPanelGrid();
panel.setColumns(4);
HtmlOutputLabel fieldOut = new HtmlOutputLabel();
fieldOut.setId("fieldOutId");
fieldOut.setValue("name");
panel.getChildren().add(fieldOut);
HtmlInputText fieldIn = new HtmlInputText();
fieldIn.setId("fieldInId");
fieldIn.setPartialSubmit(true);
fieldIn.setValueExpression(
"field", UtilFaces.createValueExpression("#{newElementBean.fieldName}",String.class));
panel.getChildren().add(fieldIn);
mainForm.getChildren().add(panel);
В newElements.xhtml я определил форму, которая связана с mainForm следующим образом:
<ice:form binding="#{newElementBean.mainForm}">
<ice:inputText id="ANOTHERFIELD" value="#{newElementBean.anotherField}"/>
<ice:commandButton action="#{newElementBean.save}" value="Save"/>
</ice:form>
Когда я нажимаю кнопку "Сохранить" и перехожу к следующему представлению, поле "ANOTHERFIELD" взяло значение из компонента и отображается правильно, но поля, которые были сгенерированы динамически, отображаются пустыми. Его значения в компоненте поддержки также равны нулю. Это как ValueExpression
не работает для HtmlInputText
что я создал в бобе поддержки. Я использую Icefaces 3.3 с Mojarra 2.1.17.
Как это вызвано и как я могу решить это?
1 ответ
Я решил это. Я сделал две ошибки:
Правильный
setValueExpression
вызов такой:fieldIn.setValueExpression("value", UtilFaces.createValueExpression("#newElementBean.fieldName}");
Я неправильно использовал
"field1"
в качестве 1-го аргумента вместо"value"
,Это не заметно в вопросе, но мой
createValueExpression()
вспомогательный метод тоже был неверным. Следующее работает для меня:public static ValueExpression createValueExpression(String expression) { Application app = FacesContext.getCurrentInstance().getApplication(); ExpressionFactory elFactory = app.getExpressionFactory(); ELContext elContext = FacesContext.getCurrentInstance().getELContext(); return elFactory.createValueExpression(elContext, expression, Object.class); }