我正在开发一个JSF组合,它将一个复杂的数据结构作为参数:
<cc:interface componentType="MyComponent">
<cc:attribute name="myModel" required="true" type="my.package.Model" />
</cc:interface>
支持组件使用init()方法处理此模型,该方法通过事件在组合中调用:
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
[...]
</cc:implementation>
在这个init()方法中,我检查模型是否已被处理(因为我不希望每次用户停留在页面上时都这样做,例如通过ajax请求)。因此,我通过StateHelper.put():
存储处理过的模型public void init()
{
if (getMyModel() == null)
{
MyModel model = processModel(...);
setMyModel(model);
}
}
@SuppressWarnings("unchecked")
public MyModel getMyModel()
{
return (MyModel) getStateHelper().get("MyModel");
}
public void setMyModel(MyModel MyModel)
{
getStateHelper().put("MyModel", MyModel);
}
我现在期望,如果在Ajax请求期间(在相同的视图范围内)调用init()方法,它不会再次处理模型,因为我已经通过StateHelper将它存储在视图范围中。但无论我尝试什么,如果我点击带有void / null结果的命令链接,getMyModel()方法总是返回null。 有什么想法吗?
答案 0 :(得分:3)
在后台组件中实现restoreState()
方法并设置断点会显示问题。 1}}事件在调用postAddToView
之前处理。使用restoreState()
代替我解决了这个问题。