JSF 2.0, частично отображаемое входное значение поля формы не обновлено в компоненте - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть форма редактирования продукта, которая предварительно заполнена значениями из БД.Пользователь может изменить одно или несколько значений и опубликовать форму обратно.Одно поле ввода с именем t: inputFileUpload отображается только после запроса ajax, если пользователь решает изменить изображение продукта. Во время последней обратной передачи формы редактирования с помощью кнопки сохранения бин не обновляется со значением поля t: inputFileUploadСоответствующая часть формы приведена ниже:

    <h:form>    
                <tr>
                    <td>Product Image*:</td>
                    <td>
                        <h:graphicImage url="#{addItem.prodFileName}" width="100" height="100"/>
                        <br /><h:commandLink  value="change image" >
                            <f:ajax render="uploadimage" execute="@this" listener="#{addItem.ChangeImage}"/>
                        </h:commandLink>
                    </td>
                </tr>

                <tr >
                    <td>
                         <h:panelGroup id="uploadimage">
                            <t:inputFileUpload rendered="#{addItem.editImgChange}" label="editImage" value="#{addItem.uploadedFile}" />
                                <h:messages for="prodimage"/>
                            <h:inputHidden id="hiddeneditimgchange" value="#{addItem.editImgChange}" />
                        </h:panelGroup>
                    </td>
                </tr>
         <h:commandButton value="save" action="#{addItem.EditItem}" />
 </h:form>

Bean-компонент AddItem находится в области запроса, и соответствующая часть его кода:

    @ManagedBean
    public class AddItem extends AbstractBean{
        boolean editImgChange;
        private UploadedFile uploadedFile;

        //..
        //getters and setters

        public void ChangeImage(){
                this.editImgChange=true;
            }

        public String EditItem() {
            //some logic 
        }
    }

Я прочитал несколько похожих вопросов.некоторые из ответов были для создания bean-компонента viewscoped. Я пытался создать bean-компонент ViewScoped, но это нарушает мою первоначальную логику предварительного заполнения значений формы.Так как я доволен RequestScoped, я сохранил состояние флага editImgChange, если его отключение влияет на обновление t: inputFileUpload.Когда я посмотрел на свойства bean-компонента, все в порядке, флаг имеет значение true, но свойство uploadedFile имеет значение null.

1 Ответ

2 голосов
/ 27 сентября 2011

Согласно комментариям, вы использовали <h:inputHidden value="#{addItem.editImgChange}" /> для сохранения состояния.Это не сработает.Атрибут rendered оценивается на этапе применения значений запроса, в то время как это скрытое значение становится доступным на этапе обновления значений модели, что, следовательно, слишком поздно.

Поскольку вы уже используете Томагавк, вместо этого используйте <t:saveState value="#{addItem.editImgChange}" />,Или просто исправьте проблему, с которой вы столкнулись при создании области видимости компонента.Я не понимаю, почему это будет проблемой.Возможно, вы используете @PostConstruct и ожидаете, что он вызывается при каждом запросе.Затем вы должны использовать <f:event type="preRenderView"> вместо.

...