【问题标题】:f:ajax listener fails within dynamically added h:selectOneMenuf:ajax 监听器在动态添加的 h:selectOneMenu 中失败
【发布时间】:2023-04-05 03:24:01
【问题描述】:

我正在向页面动态添加h:selectOneMenu。但是 f:ajax 的 listener 方法不会为 selectItems 调用,但如果从一开始就将 h:selectOneMenu 添加到页面(不是使用 update 属性动态添加),它确实有效。 我的代码如下:

(根据@Daniel 的建议更正)

    <h:commandButton value="Watch">
          <f:ajax render="deptsSelBox"/>
          <f:setPropertyActionListener value="#{true}" target="#{listRetriever.allow}" />
    </h:commandButton>  

    <h:panelGroup id="deptsSelBox">
        <h:selectOneMenu id="deptsSel" rendered="#{listRetriever.allow}" value="#{listRetriever.reqId}">  
            <f:selectItems value="#{listRetriever.list}" />
            <f:ajax listener="#{listRetriever.retrieve()}" execute="deptsSel" />
        </h:selectOneMenu>
    </h:panelGroup>  

【问题讨论】:

    标签: java jsf jsf-2 facelets


    【解决方案1】:

    h:commandButton 没有update 属性,看起来像是primefaces 和纯JSF 的混合体(update 属性来自p:commandButton)

    将f:ajax 添加到您的commandButton 并使用render 属性

    <h:commandButton value="Watch">
          <f:ajax render="deptsSelBox"/>
          <f:setPropertyActionListener value="#{true}" target="#{listRetriever.allow}" />
    </h:commandButton>   
    

    还将您的选择 ajax 修复为此

    <f:ajax listener="#{listRetriever.retrieve}" update="deptsSel"/>
    

    并尝试将范围从 request 更改为 view

    另一种方法是在方法中设置allow 的值,就像这样(您也可以将其作为参数发送)

    <h:commandButton value="Watch" action="listRetriever.updateAllow">
          <f:ajax render="deptsSelBox"/>
    </h:commandButton>  
    
    
    public void updateAllow(){
         allow = true;
    }
    

    【讨论】:

    • 是的,我使用的是 primefaces,但即使在更正此问题后,f:ajax(2nd one) 对于动态添加的h:selectOneMenu 仍然失败。请注意,h:selectOneMenu 已成功添加到页面,但 f:ajax 仍不适用于 selectItems。
    • 更新了我的答案, 也发布了您的检索代码
    • 关于您对选择 f:ajax 的建议,我无法再次更新 deptsSelBox,因为 bean 不再可用,它只是请求范围内的,并且在呈现 selectOneMenu 后不久就被删除了。顺便说一句,为什么我需要再次更新deptSelBox!?
    • 因为你没有发布任何java代码我猜listRetriever.list可能被操纵所以为了安全起见我猜你最好通过重新加载它的包装来重新加载它(不确定它是否需要.. .)
    • 是的 listRetriever.list 稍后会被用于某些用途,但我相信一旦在页面上呈现了选择项,就不需要这样做了,不是吗?
    猜你喜欢
    • 2011-08-30
    • 2012-08-26
    • 1970-01-01
    • 2016-05-06
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多