我有一个应该重定向到项目视图页面的ajax监听器。但是,由于我使用泛型类型作为模型,我想在我的公共数据表控制器中另外指定具有第二个参数的视图。
不幸的是,人们可以在两个监听器方法之间进行选择,一个使用事件参数来帮助识别对象,第二个让你有机会发送免费的参数但缺少事件。
模板:
<p:dataTable value="#{aObj.objList}" var="item" .... selectionMode="single">
<p:ajax event="rowSelect" listener="#{aObj.viewItem}" />
<p:ajax event="rowSelect" listener="#{aObj.viewItem('myItemView?_id=')}" />
...
</p:dataTable>
控制器:
public void viewItem(SelectEvent event) {
// ...
}
public void viewItem(String viewUrl) {
// ...
}
我可以为bean添加其他属性,但由于它是通用的,并且提供模型项不适合污染它。
有没有解决方法?
您可以在数据表中设置属性并在选择侦听器中读取它。为此,请使用<f:attribute name="..." value="..."/>
。来自documentation:
Constraints
必须嵌套在
UIComponent
自定义操作中。Description
找到最近的父
UIComponent
自定义操作实例(...)。如果关联组件已具有具有该名称的组件属性,则不采取任何操作。否则,在参数isLiteralText()
上调用value
方法。如果它返回true
,则将值存储在上面派生的名称下的组件属性Map中。如果它返回false
,则将ValueExpression
存储在组件的ValueExpression
Map中,其名称来自上面。
因此,根据您尝试在评论中设置的属性,您应该使用它:
XHTML:
<p:dataTable value="#{aObj.objList}" var="item" .... selectionMode="single">
<f:attribute name="test" value="abc" />
<p:ajax event="rowSelect" listener="#{aObj.viewItem}" />
...
</p:dataTable>
监听器:
public void viewItem(SelectEvent event) {
String test = (String) event.getComponent().getAttributes().get("test");
// ...
}
如果要添加特定于Ajax标记的请求参数,可以使用onstart方法:
<p:ajax onstart="cfg.ext.params.push({name: 'name', value: 'value'});"/>
通常,您应该使用模型解决参数。