有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

默认情况下,javaf:ajax rendered=false

假设我有一小段代码:

<h:panelGroup id="panel1" rendered="falseByDefault">
    <h:selectBooleanCheckbox value="#{bean.booleanProperty}">
        <f:ajax event="click" render="alwaysrendered">
    </h:selectBooleanCheckbox>
</h:panelGroup>

<h:panelGroup id="alwaysrendered">
    <h:panelGroup id="panel2" rendered="#{!bean.booleanProperty}">
        <p>Some stuff here</p>
    </h:panelGroup>
</h:panelGroup>

在我按下另一个组件之前,不会渲染panel1。 booleanProperty默认为true,直到我按下Boolean复选框,所以panel2应该会在那一刻出现,因为ajax请求重新渲染alwaysrendered

它不起作用。我认为这是因为“f:ajax”标记位于一个组件中,而该组件在页面加载时不会呈现

你觉得这个怎么样?你知道有什么其他的方法可以让它工作吗

小结:我想渲染一个带有标记的组件,该标记位于默认情况下未渲染的面板内

谢谢


共 (2) 个答案

  1. # 1 楼答案

    It doesn't work. I think because the tag is inside a component that is not rendered when the page loads.

    这正是问题所在。JSF ajax更新通过用新版本替换浏览器DOM树中的元素来工作。但是,如果没有具有您刚才重新渲染的ID的元素,因为它以前没有渲染过,那么浏览器不知道将更新的元素放在哪里,并忽略它

    请尝试以下方法:

    <h:panelGroup id="panel2" >
        <h:panelGroup rendered="#{!bean.booleanProperty}">
            <p>Some stuff here</p>
        </h:panelGroup>
    </h:panelGroup>
    

    您还需要将bean设置为至少@ViewScoped。这是因为它是这样工作的:

    最初,由于“rendered="falseByDefault"”,第一个面板不可见。然后单击其他内容,该条件变为true,使面板可见,但仅针对该请求+响应。现在,单击该可见面板中的复选框,并希望将#{bean.booleanProperty}设置为另一个值,以便显示panel2。请求将被发送,但JSF会对该请求执行一些有效性检查。它还检查您刚才单击的复选框是否可以单击(这意味着它是可见的)。但是,由于该复选框周围的面板不再可见(仅对一个请求可见),JSF决定该请求无效,并且不会按照您希望的方式处理它。这就是为什么您的复选框的布尔值从未更改,并且您的panel2将不可见

    根据经验:永远不要将@RequestScoped与Ajax请求一起使用

  2. # 2 楼答案

    您需要在panelGroup“pane2”周围放置一个id为的包装标签,然后在ajax渲染属性中引用该标签。这是必需的,因为javascript试图通过id更新组件。但如果未呈现组件,因此未找到组件,则不会发生更新