【问题标题】:f:ajax inside rich:popupMenu can't execute component from different formf:ajax 里面 Rich:popupMenu 不能从不同的表单执行组件
【发布时间】:2012-07-05 09:22:02
【问题描述】:

我有一个<rich:popupPanel> 标记,在其中我使用<f:ajax> 事件。因此<rich:popupMenu> 也需要在其中有一个<h:from>。在我的 ajax 事件中,我需要从“主页”中获取一个值,因此我将它与相应的 :formid:elementid 模式一起列在执行列表中,但这不起作用 - 侦听器方法中的值为 null。这是代码:

    <h:form id="form">
        ...
        <h:selectOneMenu  id="selectUser" value="#{usersBean.user_id}" styleClass="comboBoxes" >
            <f:selectItems value="#{usersBean.myModelUsersValues}" />   
            <a4j:ajax event="valueChange" listener="#{usersBean.userSelected}" render="login password customer_name" execute="@this"/>      
        </h:selectOneMenu >
        ...
    </h:form>
    <rich:popupPanel id="popup" modal="true" autosized="true" resizeable="false">

    <f:facet name="header">
        <h:outputText value="Atributes" />
    </f:facet>
    <f:facet name="controls">
        <h:outputLink value="#" onclick="#{rich:component('popup')}.hide(); return false;">
            X
        </h:outputLink>
    </f:facet>
    <h:form id="popupForm">
            ...
            <h:selectOneListbox  id="atrib_list" value="#{usersBean.atribSelect}" styleClass="comboBoxes" style="height:100px;width:100px;">
                        <f:selectItems value="#{usersBean.atribValues}" />  
                        <f:ajax event="valueChange" listener="#{usersBean.atribValuesChanged}" render="child_list" execute="@this :form:selectUser"/>                           
            </h:selectOneListbox > 
            ...
    </h:form>
    </rich:popupPanel> 

usersBean.atribValuesChanged 侦听器方法中,usersBean.user_id 字段为空(没有选择的值)。如何强制执行 form:selectUser 元素,以便我可以在侦听器方法中读取它的选定值?

第二部分:

这只是顺便说一句。问题,也许我应该为此打开另一个线程。问题是当&lt;h:selectOneListBox&gt; 只有一个值时,它的创建更像h:selectOneMenu。这看起来很糟糕,并且当您选择它时不会触发 valueChange 事件。 &lt;h:selectManyListBox&gt;中不存在这个问题是bug吗?可以修复吗?

【问题讨论】:

    标签: ajax jsf richfaces popuppanel


    【解决方案1】:

    这是预期的行为,您确实无法在表单之外提交任何数据。

    您可以在表单外重新呈现 JSF 组件(请参阅本文),但您不能将表单外的任何内容发送到服务器。

    所以,也许您想要做的是在您要发送的表单内放置一个h:inputHidden,在第一个表单的h:selectOneMenu 中重新呈现它,然后在表单上发送idUserHidden

    <h:form id="form">
        ...
        <h:selectOneMenu  id="selectUser" value="#{usersBean.user_id}"
          styleClass="comboBoxes" >
            <f:selectItems value="#{usersBean.myModelUsersValues}" />   
                <!-- rerender the hidden input also: -->
                <a4j:ajax event="valueChange" listener="#{usersBean.userSelected}"
              render="login password customer_name :idUserHidden" execute="@this"/>      
        </h:selectOneMenu >
        ...
    </h:form>
    ....
    <h:form>
        ....
        <!-- hidden input to submit the same value of :selectUser -->
        <h:inputHidden id="idUserHidden" value="#{usersBean.user_id}" />
    
        <h:selectOneListbox  id="atrib_list" value="#{usersBean.atribSelect}"
           styleClass="comboBoxes" style="height:100px;width:100px;">
            <f:selectItems value="#{usersBean.atribValues}" />  
            <f:ajax event="valueChange" listener="#{usersBean.atribValuesChanged}"
              render="child_list" execute="@this idUserHidden"/>                           
            </h:selectOneListbox > 
    </h:form>
    

    【讨论】:

    • 感谢这项工作。你有part2的答案吗?到目前为止,如果 usersBean.atribSelect.size() ,我只能覆盖 selectOneListBox 的大小属性并将其设置为 2
    • 不客气!抱歉,我自己从未使用过h:selectOneListBox。您应该为此提出另一个问题,以便得到更多适当的关注。
    猜你喜欢
    • 2014-02-14
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2020-04-23
    相关资源
    最近更新 更多