【问题标题】:Data model is not updated when submitting form with RichFaces tabpanel使用 RichFaces 选项卡面板提交表单时未更新数据模型
【发布时间】:2012-06-14 15:38:03
【问题描述】:

我的页面中有以下布局(简化)

<h:form>
    <h:commandButton action="#{bean.save} value="Save"/>

    <rich:tabPanel switchType="ajax">
        <rich:tab name="one" switchType="client">

        </rich:tab>

        <rich:tab name="two" switchType="ajax">

        </rich:tab>

        <rich:tab name="three" switchType="client">

        </rich:tab>

    </rich:tabPanel>
</h:form>

选项卡“一”和“三”有 switchType="client",它们上有一些输入,绑定到 bean 属性。当按下“保存”时,我希望 bean 属性将从两个选项卡中的输入更新。但是,仅从当前选项卡上的输入更新属性。尽管提交了整个表单(我已在 HTTP 观察程序中检查过),但来自另一个选项卡的值会丢失。因此,用户必须在一个选项卡中输入数据,按“保存”,然后在另一个选项卡上更新值并按“保存”以保存所做的所有更改。如何一次从所有选项卡中传播值?

【问题讨论】:

    标签: java jsf richfaces


    【解决方案1】:

    您可以使用 javascript 轻松完成此操作。您需要做的所有事情(一旦设置了选项卡)就是添加逻辑以显示和隐藏不同的选项卡式组件。

    【讨论】:

    • 问题不在于显示或隐藏选项卡式组件。问题是隐藏选项卡中的值不会传播到数据模型,尽管它们是通过 HTTP 提交的
    • 对不起,我的意思是把你所有的表单元素放在一个表单上,并用javascript隐藏它的不同部分。似乎每个选项卡都以自己的形式运行?
    • 这不是一个选项,我们有很多使用标签面板实现的页面,我想用这种方法来解决问题。
    • 页面渲染时,每个标签页是否包含自己的表单?
    • 不,所有选项卡都采用一种形式,如上面的标记中所述
    【解决方案2】:

    首先,将&lt;h:commandButton /&gt; 更改为&lt;a4j:commandButton /&gt;,这样您的提交将通过对服务器的ajax 请求进行。也可以在操作后重新渲染页面内容。

    <h:form>
        <!-- RichFaces 3.3 -->
        <a4j:commandButton value="Save"
            action="#{bean.save}"
            reRender="tbpMyTabs" />
        <!-- RichFaces 4. -->
        <a4j:commandButton value="Save"
            action="#{bean.save}"
            render=":tbpMyTabs" />
    
        <rich:tabPanel id="tbpMyTabs" switchType="ajax">
            <rich:tab name="one" switchType="client">
            </rich:tab>
            <rich:tab name="two" switchType="ajax">
            </rich:tab>
            <rich:tab name="three" switchType="client">
            </rich:tab>
        </rich:tabPanel>
    </h:form>
    

    要发出成功的 action ajax 请求,请将 Save 方法更改为返回 void,这样 JSF 就不会遵循导航规则。如果您使用 JSF 2,您的 bean 应该有视图范围,否则它应该有请求范围和 KeepAlive 注释。

    RichFaces 3.3 Bean 实现

    @KeepAlive
    public class Bean {
        public Bean() {
        }
        public void save() {
        }
    }
    

    JSF 2 / RichFaces 4.x Bean 实现

    @ManagedBean
    @ViewScoped
    public class Bean {
        public Bean() {
        }
        public void save() {
        }
    }
    

    【讨论】:

    • 您的解决方案也不起作用。以及将 更改为 有何帮助?
    • 如果您在每个 &lt;rich:tab&gt; 中使用不同的 bean,它们应该具有 @KeepAlive 标记和请求范围 (RF 3.x) 或视图范围 (JSF 2/RF 4)。也许如果您发布您正在做的事情的示例,我可以编辑我的帖子以给出准确的答案,而不是猜测您会得到什么。
    • 已经找到解决办法:我把tabpanel的switchType从“ajax”改成了“client”
    【解决方案3】:

    已找到解决方案:我已将tabpanel的switchType从“ajax”更改为“client”。谢谢大家的建议!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多