1

我在我的新 JSF 2.1 应用程序中使用复合、标记或自定义组件。

我仍然经常忽略继续使用这项技术的正确(或至少推荐)方法。

我希望我的组件在用户单击“保存”按钮时执行一些操作。实际上,保存按钮是 Primefaces 命令按钮。

所以,我正在使用按钮代码,例如:

<p:commandButton id="example" type="submit" value="Confirmer les modifications" process="targetComponent" update="<compoents to update list>">
    <f:param name="save" value="true>
</p:commandButton>

对于“保存”按钮和我的组件,我使用 preRenderComponent 来触发 handleSubmit 支持 bean 方法:

<f:event type="preRenderComponent" listener="#{myBeautifulBean.handleSubmit}"/>

handleSumit 看起来像:

public void handleSubmit() {
    FacesContext context = FacesContext.getCurrentInstance();
    String saveMandats = JSFUtils.getRequestParameter("save");
    if(context.isPostback() && !context.isValidationFailed() && (saveMandats != null) && !saveMandats.isEmpty())
        confirmeModifsSelection();
}

行得通

阅读stackoverflow并尝试遵循@BalusC的建议,我正在使用omnifaces(1.2)并尝试使用postInvokeAction事件,原因在OmniFacesInvokeActionEventListener展示中进行了解释。

所以,我将我的事件标签更改为:

<f:event type="postInvokeAction" listener="#{myBeautifulBean.handleSubmit}"/>

...并且 myBeautifulBean.handleSubmit 永远不会被调用。

当然,我将omnifaces 作为依赖项,而其他组件(验证器等)则可以正常工作。InvokeActionListener 已正确初始化(或者在我看来是这样)。

postInvokeAction 是否应该在特定时间注册?我注意到在omnifaces 示例中,{pre|post}InvokeAction 事件总是在 f:metadata 标记中声明为子项。

我发现了很多在 f:metadata 之外声明 preRenderView 事件的示例,例如:http ://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/

顺便说一句,如果我这样做是完全错误的,我会很高兴学习你的智慧。但我想避免:

  • 由 ap:commandButton 动作处理程序触发支持 bean 方法的链调用;
  • 将每个此类动作处理程序声明为 commandButton 的 af:actionListener 子项。

我正在寻找一种更面向事件的方式。

4

1 回答 1

1

InvokeActionEventListener如展示柜中所述和所示,此事件仅适用于UIViewRootUIForm和。所以如果你想要一个通用的钩子(在视图上),那么你需要把它放在. 这需要通过将其放置在.UIInputUICommandUIViewRoot<f:metadata>

并且不需要特定的父组件,您实际上可以将它放置在视图中的任何位置,它总是注册到最近的父 UI 组件preRenderComponent。这对/preRenderView没有多大意义,因为并非每种组件都参与调用操作。例如,将它放在 a 中就不会是非常自我记录的。preInvokeActionpostInvokeAction<h:panelGroup>

于 2012-11-07T11:03:35.933 回答