Firefox сохраняет содержимое массива внутри JSF-Viewscoped-Managed-Bean даже после обновления страницы - PullRequest
4 голосов
/ 07 января 2012

Такое странное поведение имеет место только в Firefox (в частности, Firefox 8).Итак, у меня есть dataTable, который я могу сделать multiple selection.Кнопка отправки, которая будет отображать список выбранных элементов до dataList и до dialog.Если пользователь ничего не выбрал, то появляется сообщение об ошибке с просьбой выбрать что-то.Диалог не появится, если пользователь ничего не выберет.Код ниже делает все это.Однако FireFox ведет себя странно, если вы выполните следующие действия:

  1. Нажмите, чтобы выбрать элемент на dataTable
  2. Затем обновите (F5 или Ctl + R) страницу (вы можете увидетьвыбор был отменен)
  3. Затем нажмите «Отправить», чтобы показать все, что я только что выбрал.

Это неожиданно, поскольку обновление должно очищать все, что вы только что выбрали, из-за природы боба @ViewScoped.Такое поведение происходит только в Firefox.IE 8 ведет себя правильно для меня.Это ошибка, или я здесь что-то не так делаю?

Mojarra 2.1 + PrimeFaces3.0 Final + Tomcat 7

UPDATE : Iпри некоторой отладке, когда я обновляю страницу, значение массива selectedFoods становится null, но по какой-то странной причине, когда оно достигает public void checkSelection(), оно содержит значение предыдущего выбора.Странно.

Вот мой код.

<p:growl id="messages" showDetail="true" />  
<p:messages id="msgs"/>
<h:form id="form">  
    <p:dataTable value="#{viewBean.foodList}" var="item" 
                  selection="#{viewBean.selectedFoods}"
                  selectionMode="multiple"
                  rowKey="#{item}">
        <p:column>
             #{item}
        </p:column>
        <f:facet name="footer">
            <p:commandButton value="Submit" update=":form:display :dataList" 
                                 action="#{viewBean.checkSelection}"/>
        </f:facet>
    </p:dataTable>
    <p:dataList id="display" value="#{viewBean.selectedFoods}" var="item"
                    itemType="disc">
        #{item}
    </p:dataList>
</h:form>
<p:dialog id="dialog1" widgetVar="dialog1" dynamic="true" width="200">
    <p:dataList id="dataList" value="#{viewBean.selectedFoods}" var="item"
                    itemType="disc">
        #{item}
    </p:dataList>
</p:dialog>

Вот мой управляемый боб

@ManagedBean
@ViewScoped
public class ViewBean implements Serializable {
    private List<String> foodList;
    private String[] selectedFoods;

    @PostConstruct
    public void init() {
        foodList = new ArrayList<String>();
        foodList.add("Pizza");
        foodList.add("Pasta");
        foodList.add("Hamburger");
    }

    public void checkSelection(){
        RequestContext requestContext = RequestContext.getCurrentInstance();
        if(selectedFoods.length > 0){
            requestContext.execute("dialog1.show()");
        }else{
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Error", "Please select"));
            requestContext.addPartialUpdateTarget("messages");
        }
    }
    //setter, getter
 }

1 Ответ

1 голос
/ 09 января 2012

Ваш код в порядке. То, что вы видите, происходит из-за чего-то, что, как предполагается, является особенностью Firefox (я смог воспроизвести это на FF4). Модель выбора для p:dataTable реализована с помощью скрытого поля формы. При перезагрузке страницы Firefox пытается сохранить и восстановить значения полей формы, которые изменились, чтобы вы не потеряли введенное вами значение. Вы можете наблюдать это, добавив <h:inputText/> к вашему виду, набрав что-то на входе и перезагрузив.

Я не уверен, что команда Firefox хотела, чтобы это применялось к скрытым полям формы, но я полагаю, что у них есть неплохой шанс. Я планирую отправить отчет об ошибке в Primefaces, чтобы либо инициализировать скрытый ввод, либо прочитать ввод при загрузке, чтобы сопоставить выбор p:dataTable. Любое из этих решений должно привести к синхронизации визуализации и скрытой модели выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...