我有一个应该重定向到项目视图页面的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="..."/>。从文档中:
<f:attribute name="..." value="..."/>
约束条件 必须嵌套在UIComponent自定义动作中。 描述 找到最近的父UIComponent自定义操作实例(…)。如果关联的组件已经具有使用该名称的组件属性,则不执行任何操作。否则,请isLiteralText()在参数上调用方法value。如果返回true,则将值存储在组件的属性Map中,并使用上面导出的名称。如果返回false,则ValueExpression使用上述ValueExpression派生的名称将其存储在组件的Map中。
必须嵌套在UIComponent自定义动作中。
UIComponent
找到最近的父UIComponent自定义操作实例(…)。如果关联的组件已经具有使用该名称的组件属性,则不执行任何操作。否则,请isLiteralText()在参数上调用方法value。如果返回true,则将值存储在组件的属性Map中,并使用上面导出的名称。如果返回false,则ValueExpression使用上述ValueExpression派生的名称将其存储在组件的Map中。
isLiteralText()
value
true
false
ValueExpression
因此,采用您尝试在注释中设置的属性,您应该像这样使用它:
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"); // ... }