首页 文章

JSF:如果selectOneMenu的渲染是动态的,如何从中获取所选项目?

提问于
浏览
1

在我看来,我有两个菜单,我想依赖,即,如果第一个菜单保存值“渲染第二个菜单”和“不渲染第二个菜单”,我想只有当用户选择“渲染第二个”时才能渲染第二个菜单菜单“第一个菜单中的选项 . 在第二个菜单呈现与第一个菜单相同的页面后,用户必须从中选择当前项目,填写另一个字段并提交表单以在数据库中存储值 . 两个选项列表都是静态的,它们从数据库中获取一次并保持不变 . 我的问题是我总是将null作为第二个菜单中所选项目的值 . 如何获得适当的 Value ?包含有问题元素的示例代码示例是:

<h:selectOneMenu id="renderSecond" value="#{Bean.renderSecondValue}"
                                 valueChangeListener="#{Bean.updateDependentMenus}"
                                 immediate="true"
                                 onchange="this.form.submit();" >
                    <f:selectItems value="#{Bean.typesOfRendering}" />
                </h:selectOneMenu>
<h:selectOneMenu id="iWillReturnYouZeroAnyway" value="#{Bean.currentItem}" rendered="#{Bean.rendered}" > <f:selectItems value="#{Bean.items}" /> </h:selectOneMenu>
<h:commandButton action="#{Bean.store}" value="#Store" />

但是,如果我从第二个菜单中删除“呈现”属性,一切正常,除了我试图阻止的所有时间显示菜单,所以我建议问题是动态渲染的行为 . isRendered的初始值为false,因为第一个菜单中的默认项是“不渲染第二个菜单” . 当我在第一个菜单中更改值并使用valueChangeListener更新isRendered时,将显示第二个菜单,但在提交时它不会初始化currentItem .

我的支持bean的一些代码如下:

public void updateDependentMenus(ValueChangeEvent value) {
    String newValue = (String) value.getNewValue();
        if ("render second menu" == newValue){
            isRendered = true;
        } else {
            isRendered = false;
        }
}

public String store(){
    System.out.println(currentItem);
    return "stored";
}

2 回答

  • 3

    如果您在 UIInputUICommand 组件上使用 rendered 属性,则必须确保 rendered 条件在后续请求中(在提交表单期间)与初始请求期间(在显示期间)完全相同的方式评估形成) . 当它评估为false时,将更新请求值,并且不会为相关组件调用任何操作 .

    一个简单的解决方法是将bean放在会话范围内,但这也有一些警告(在多个浏览器选项卡/窗口中打开相同页面时用户体验不佳) . 在JSF 2.0上,您可以使用视图范围 . 在JSF 1.x上你会使用Tomahawk的 t:saveState .

  • 0

    只有当我们将“不渲染”作为第一选择时才会出现问题 . 我决定更改数据库中的值,现在我将“渲染第二个菜单”作为第一个 . 有了这样的方法,一切都很好 .

相关问题