将其他参数发送到Ajax事件侦听器

时间:2016-08-25 11:05:57

标签: ajax jsf primefaces parameters

我有一个应该重定向到项目视图页面的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添加其他属性,但由于它是通用的,并且提供模型项不适合污染它。

有解决方法吗?

2 个答案:

答案 0 :(得分:20)

您可以在数据表中设置一个属性,然后在select listener中读取它。为此,请使用<f:attribute name="..." value="..."/>。来自documentation

  

约束

     

必须嵌套在UIComponent自定义操作中。

     

描述

     

找到最近的父UIComponent自定义操作实例(...)。如果关联的组件已有组件   具有该名称的属性,不采取任何行动。否则,请在参数isLiteralText()上调用value方法。如果它   返回true,将值存储在上面派生的名称下的组件属性Map中。如果它返回false,则存储   组件的ValueExpression地图中的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");
  // ...
}

答案 1 :(得分:2)

要添加特定于Ajax标记的请求参数时,可以使用onstart方法:

<p:ajax onstart="cfg.ext.params.push({name: 'name', value: 'value'});"/>

通常,您应该使用模型求解参数。