Такое странное поведение имеет место только в Firefox (в частности, Firefox 8).Итак, у меня есть dataTable
, который я могу сделать multiple selection
.Кнопка отправки, которая будет отображать список выбранных элементов до dataList
и до dialog
.Если пользователь ничего не выбрал, то появляется сообщение об ошибке с просьбой выбрать что-то.Диалог не появится, если пользователь ничего не выберет.Код ниже делает все это.Однако FireFox ведет себя странно, если вы выполните следующие действия:
- Нажмите, чтобы выбрать элемент на
dataTable
- Затем обновите (F5 или Ctl + R) страницу (вы можете увидетьвыбор был отменен)
- Затем нажмите «Отправить», чтобы показать все, что я только что выбрал.
Это неожиданно, поскольку обновление должно очищать все, что вы только что выбрали, из-за природы боба @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
}