我目前正在从事 JSF 1.2 项目(IBM 实施和“公司层”)。
问题
这是情况(项目数量仅用于示例),简单的 CRUD
- 项目清单
- 我有一个物品清单
- 我点击第 2 项查看详细信息
- 我点击修改,修改页面显示第2项的值
- 使用“返回”按钮返回列表,并且
immediate="true"
(因为我们不想提交修改) - 第 4 项的详细信息
- 修改第 4 项 >显示第 2 项的值
但
- 如果我将“返回”按钮的“立即”属性设置为
false
,则第 4 项的值是可以的。 - 如果我将 inputText 组件的“禁用”属性设置为
true
,则第 4 项的值是可以的。 - 如果我使用
<h:outputText value="#{item4.myValue}/>
(UIOutput) 而不是<h:inputText value="#{item4.myValue}/>
(UIInput)
另外,我在调试模式下检查了我想要显示的 bean 是“item 4”,它确实是。
我发现了什么
经过谷歌的一些研究,我发现这个问题来自JSF 的生命周期,尽管找到的文档和解决方案是针对 JSF 的特定实现的。所以我猜这是因为值是用“localValue”而不是“submittedValue”填充的(@see EditableValueHolder interface可以帮助理解),并且这些页面中有一些解决方案
结果
它不起作用(我不会在这里,我发誓^^)。“刷新”解决方案无效。“擦除输入”很吓人。我不能承认我需要引用每个输入字段!setSubmittedValue()
另外,我在 IBM JSF 中的 UIInput 上没有找到该方法。“清除”方法无效。我尝试了一个元素,并使用此代码在完整的组件树上
public void cleanAllChildren(List<UIComponentBase> list){
for(UIComponentBase c : list){
this.cleanAllChildren(c.getChildren());
c.getChildren().clear();
}
}
但没有成功。所以我在这里。 我错过了什么?有没有我没有看到的好棘手的解决方案?我对 JSF 生命周期并不是很熟悉。