PrimeFaces:我如何声明和绑定一个AJAX" rowEdit"事件以p:dataTable编程?

时间:2012-07-19 16:48:41

标签: jsf-2 datatable primefaces

我还在开发我的数据表UI应用程序,最后我是关于这个组件开发的最后阶段:内联单元格编辑。

首先,数据表是在Java端完全动态构建的,并且没有使用facelet声明来描述表。如果我有一个静态表声明,可以指定编辑like this(参见In-Cell Editing章节):

<p:dataTable>
    ...
    <p:ajax event="rowEdit" listener="#{tableBean.onEdit}"/>  
    ...
</p:dataTable>

我可以轻松地在Java代码中使用dataTable.setEditable(true)指定可编辑的数据表 - 并且它可以正常工作,请注意,编辑“保存/取消”图标工作正常,但在后端无效。因为我不能以PF ShowCase Labs页面指定的方式声明(我必须总是在那里使用监听器吗?)因为数据表是动态呈现的,所以我试图使用以下内容:

public static AjaxBehavior createAjaxBehavior(MethodExpression expression) {
    final AjaxBehavior behavior = new AjaxBehavior();
    behavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(expression));
    return behavior;
}
...
dataTable.addClientBehavior("rowEdit", createAjaxBehavior(createMethodExpression(TableBean.class, "onEdit", void.class, new Class<?>[] {RowEditEvent.class})));

但是只要我添加rowEdit监听器,就像我上面要做的那样,哇我突然得到:mojarra is not defined并且没有保存/取消行编辑按钮正在工作。好的,我发现了一个类似的问题描述并解决了here,手动包含了必要的脚本,现在客户端JavaScript错误消失了,但是我仍然无法退出行编辑模式,并且行仍未更新

我整天都在浪费时间去弄清楚发生了什么,而我却看不出正确的方法。我是否只是遗漏了一些东西(例如识别某一行,或者可能在某处指定其他东西 - 但我的Java代码生成的内容不会超过PF示例中指定的内容),或者其他什么?

提前致谢。

2 个答案:

答案 0 :(得分:1)

嗯,我刚刚通过以下方法找出了真正的原因:

public static AjaxBehavior createAjaxBehavior(MethodExpression expression) {
    final AjaxBehavior behavior = new AjaxBehavior();
    behavior.addAjaxBehaviorListener(new AjaxBehaviorListenerImpl(expression));
    return behavior;
}

事实上,该方法实际上返回javax.faces.component.behavior.AjaxBehavior (h:ajax?)而不是org.primefaces.component.behavior.ajax.AjaxBehavior (p:ajax) - 这是因为快速自动完成所以我只是错过了这个事实。

我很沮丧,PrimeFaces库没有回复任何错误。


只是为了完成Q&amp;答:

  • Mojarra 2.1.7
  • PrimeFaces 3.2

答案 1 :(得分:-1)

现在(至少对于PF 6.0)应该是org.primefaces.behavior.ajax.AjaxBehavior