我遇到了立即=“真”的问题(JSF 1.2)。我的表格是关于车祸的:用户填写一些使用信息,然后他可以根据自己的意愿添加尽可能多的受影响物品(树木,栅栏,其他汽车等)
支持bean
private String location;
private List<T> items;
private HtmlDataTable itemsUI;
public void remove(ActionEvent e) {
String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
items.remove(Integer.parseInt(id));
}
public void add(ActionEvent e) throws InstantiationException, IllegalAccessException {
items.add(element.newInstance());
}
JSPX
<h:inputText
required="true"
value="#{ACC01.location}"/>
<h:dataTable
binding="#{ACC01.itemsUI }"
value="#{ACC01.items}"
var="item">
<h:column>
<h:selectOneMenu
value="#{item.id}>
<f:selectItems
value="#{ACC01.possibleElements}" />
</h:selectOneMenu>
<h:commandLink
actionListener="#{ACC01.remove }"
value="Remove" >
<f:param
name="id"
value="#{ACC01.itemsUI.rowIndex }"/>
</h:commandLink>
</h:column>
</h:dataTable>
<h:commandLink
actionListener="#{ACC01.add}"
value="Add" />
问题
如果我为dataTable中受影响的元素设置了immediate =“true”,当用户添加新元素时,其他元素将返回其默认值(例如,如果你有{'tree','car' ,'fence'}它们变为{'默认','默认','默认',新元素})
如果我不立即使用,受影响的元素会保留正确的值,但在添加或删除受影响的元素之前,用户必须填写“位置”字段。
我想要的是能够保留受影响元素的值,并允许用户添加或删除它们,而无需先填写“位置”字段。
解决方法
在阅读了很多关于这个主题的帖子后,似乎唯一的方法就是避免自动验证,并在用户提交表单时手动进行。
检查必填字段的空值,并以编程方式将错误消息附加到facescontext。我真的不想这样做,因为我觉得它很难看。
您能否建议更好的方法来实现我需要的行为?
提前致谢
答案 0 :(得分:3)
我目前工作的一位先前的开发人员提出了以下解决方案
JSPX
<h:inputText required="#{ACC01.saving}" value="#{ACC01.location}"/>
支持Bean
private UICommand btn;
public boolean isSaving()
{
Map<?,?> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
return (params.containsKey(btn.getClientId(ctx)));
}
在你的情况下可能不完全正确,但基本上他创建了一个从屏幕上的按钮到支持bean中的'btn'变量的绑定。然后inputText只会在单击btn时看到所需的位置文本。在你的情况下,它是一个命令链接,所以它可能会有所不同,但我认为它可能有所帮助。