我想知道在两个ViewScoped beans之间传递数据(对象)的最佳实践是什么。
它们需要是视图作用域,因为这里有一个问题被精彩地解释了here (简而言之:在两个视图中,我都使用了
现在我的问题是,点击链接也会导航到新视图,所以使用以下代码,我的对象被传递,但当视图更改时,
它们需要是视图作用域,因为这里有一个问题被精彩地解释了here (简而言之:在两个视图中,我都使用了
h:dataTable
内的h:commandLink
,提交时需要数据模型仍然存在)。现在我的问题是,点击链接也会导航到新视图,所以使用以下代码,我的对象被传递,但当视图更改时,
DetailViewController
实例就被销毁并创建一个新实例。<h:dataTable value="#{searchController.dataModel}" var="item">
...
<h:column>
<f:facet name="header">Action</f:facet>
<h:commandLink id="open" value="open" action="#{searchController.showDetail(item)}" />
</h:column>
</h:dataTable>
Bean:
@ManagedBean
@ViewScoped
public class SearchController {
@ManagedProperty(value="#{detailViewController}")
private DetailViewController detailViewController;
// getters, setters, etc. ...
public String showDetail(Item i) {
detailViewController.setItem(i);
return "view_detail.xhtml";
}
}
你怎么解决这个问题?我考虑把对象放在Flash里:FacesContext.getExternalContext.getFlash()
... 是否有更简单或更优雅的解决方案?
detailViewController
设置为托管属性,那是完全错误的。返回其视图ID(在您的情况下可以是view_detail
,请注意我正在修剪.xhtml
)。稍后,在view_detail.xhtml中引用detailViewController
,并且您将通过框架实例化它。对于传递参数,您有多种选择,例如使用视图参数、使用Flash范围、使用Flow范围等等...只需搜索一下,您就会在SO上找到有趣的参考资料,这里是我的参考链接:flash和view。 - Aritz