【问题标题】:Listener on Omnifaces preInvokeAction/postInvokeAction not invoked without viewParamOmnifaces 上的监听器 preInvokeAction/postInvokeAction 在没有 viewParam 的情况下不会被调用
【发布时间】:2016-05-19 13:36:01
【问题描述】:

我不能 100% 确定这不符合设计,但似乎只有在存在 viewParam 时才会调用视图元数据中的 preInvokeAction 侦听器。

以下作品:

<f:metadata>
    <f:viewParam name="test" value="#{myForm.myValue}"/>
    <f:event type="preInvokeAction" listener="#{myController.initializeForm}"/>
</f:metadata>

但这不是:

<f:metadata>
    <f:event type="preInvokeAction" listener="#{myController.initializeForm}"/>
</f:metadata>

如果没有视图参数,invokeAction 阶段可能不存在,所以它没有意义,但我对这个级别的生命周期不够熟悉,不知道是这种情况还是这种情况只是错过了。

一种解决方法是只输入一个虚假参数。

有谁知道这是错误还是预期?

【问题讨论】:

    标签: jsf omnifaces


    【解决方案1】:

    它确实按设计工作。

    这些事件在INVOKE_APPLICATION 阶段触发。当在RESTORE_VIEW 阶段没有发现视图参数时,JSF 将立即进入RENDER_RESPONSE 阶段。中间的所有阶段都将被跳过:APPLY_REQUEST_VALUESPROCESS_VALIDATIONSUPDATE_MODEL_VALUESINVOKE_APPLICATION

    解决方法确实是声明一个“虚拟”&lt;f:viewParam&gt;,或者更好的是,使用 JSF 2.2 提供的 &lt;f:viewAction&gt; 代替 InvokeActionEventListener documentation 中提到的。

    <f:viewAction action="#{myController.initializeForm}" />
    

    请注意,&lt;f:viewParam&gt; 不一定需要 bean 属性。

    <f:viewParam name="test" />
    

    它将被隐式放置在请求范围内,并以#{test} 的形式提供。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2021-10-26
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多