PrimeFaces:如何以编程方式将 AJAX "rowEdit" 事件声明并绑定到 p:dataTable?



我仍在开发我的数据表UI应用程序,最后我将进入该组件开发的最后阶段:内联单元格编辑。

首先,数据表是在Java端完全动态构建的,不使用facelet声明来描述表。如果我有一个静态表声明,那么编辑可以这样指定(请参阅"单元格内编辑"一章):

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

我可以很容易地在Java代码中指定用dataTable.setEditable(true)可编辑的数据表,它很有效,请注意,编辑保存/取消图标很好,但在后端没有效果。由于数据表是动态呈现的,因此我无法按照PFShowCaseLabs页面上指定的方式进行声明(我必须始终使用那里的侦听器吗?),因此我尝试使用以下内容:

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和没有保存/取消行编辑按钮正在工作。好的,我发现了一个类似的问题,在这里描述并解决了,手动包含了必要的脚本,现在客户端JavaScript错误已经消失,但我仍然无法退出行编辑模式,行仍然没有更新

我花了一整天的时间试图弄清楚发生了什么,但我看不到正确的方法。我只是错过了后面的东西吗(比如识别某一行,或者可能在某个地方指定其他东西——但我的Java代码不会生成比PF示例中指定的更多的东西),或者其他什么?

提前谢谢。

好吧,我刚刚通过以下方法找到了真正的原因:

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库没有回复任何错误,这让我很沮丧。


只是为了完成问答;A:

  • Mojarra 2.1.7
  • PrimeFaces 3.2

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

最新更新