Динамически созданные компоненты ввода не показывают значения модели

У меня есть несколько полей компонента, которые мне нужно показать программно. Это что-то вроде этого:

         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 ответ

Решение

Я решил это. Я сделал две ошибки:

  1. Правильный setValueExpression вызов такой:

    fieldIn.setValueExpression("value", UtilFaces.createValueExpression("#newElementBean.fieldName}");
    

    Я неправильно использовал "field1" в качестве 1-го аргумента вместо "value",

  2. Это не заметно в вопросе, но мой 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);
    }
    
Другие вопросы по тегам