【问题标题】:Updating p:commandButton action by ajax doesn't end up in right action being invoked通过 ajax 更新 p:commandButton 操作不会导致调用正确的操作
【发布时间】:2013-06-26 13:34:30
【问题描述】:

我在 h:form 组件中有一个 p:selectOneMenu 组件,例如:

<p:selectOneMenu id="scroll" rendered="#{projectPageBean.rendered}"
    value="#{projectPageBean.selectedInstrument}">
    <f:selectItems value="#{projectPageBean.instruments}"/>
    <p:ajax event="change" listener="#{projectPageBean.valueChanged}" update="test" />
</p:selectOneMenu>

在同一个表单中,我定义了一个 p:commandButton 组件:

<p:commandButton id="test"
    value="View Instrument"
    action="#{projectPageBean.getPage}"
    update="@this,:add-instrument-dialog-form:scrolladd"/>

根据 selecOneMenu 中的 selectedInstrument,通过 p:commandButton 的 action 属性的导航应该不同。

托管 bean projectPageBean 是请求范围的。

这是可行的还是我应该尝试不同的方法?

【问题讨论】:

    标签: ajax jsf primefaces action


    【解决方案1】:

    action 属性在实际提交表单的请求期间进行评估。由于这是在与您更改它的请求不同的请求期间发生的,并且由于您的 bean 是请求范围的,因此它将失败。 bean 即被重构,所有属性都设置为默认值。

    您需要将 bean 放在视图范围内才能使这个构造工作。

    @ManagedBean
    @ViewScoped
    public class ProjectPageBean {}
    

    或者,如果getPage() 仅返回String,则改为使用&lt;p:button&gt;。

    <p:button ... outcome="#{projectPageBean.page}" />
    

    outcome 属性在呈现 HTML 输出期间进行评估,因此它在这种构造中可以正常工作。

    另见:

    【讨论】:

    • 这个范围'东西'相当棘手,必须非常注意它!再次感谢!
    • 如果您了解 JSF 所基于的底层基本概念(并且抽象到相当高的程度,您再也看不到它)会更容易,例如 HTTP 请求、HTML 表单回发、HTTP 会话等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 2010-12-01
    • 2013-02-26
    • 2015-09-29
    • 2016-06-17
    • 2013-09-28
    相关资源
    最近更新 更多