1

我的 JSF 页面使用 PrimeFaces 组件有问题。由于它可能会很快变得冗长而乏味,因此我尽量简短。考虑这个托管 bean:

@Named(value = "testBean")
@RequestScoped
public class TestBean implements Serializable {

    private String test;

    public String update() {
        test = "Updated.";
        return "test";
    }

    // Getters and Setters...
}

这是 的正文test.xhtml,删除了不相关的内容和样式:

<h:body>
    <p:layout id="layout" fullPage="true">

        <p:layoutUnit position="north">
            <!-- Does not matter -->
        </p:layoutUnit>

        <p:layoutUnit id="input" position="west">
            <p:panel header="">
                <p:tabView>
                    <p:tab title="">
                        <!-- INPUTS and SUBMIT BUTTON -->
                    </p:tab>
                </p:tabView>
            </p:panel>
        </p:layoutUnit>

        <p:layoutUnit id="output" position="center">
            <h:form>
                <p:panel id="display" header="Information">  
                    <h:outputText value="#{testBean.test}" />  
                </p:panel>
                <p:separator />
                    <p:commandButton value="Update !" action="#{testBean.update()}" ajax="false" />
            </h:form>
        </p:layoutUnit>

        <p:layoutUnit position="south">
            <!-- Does not matter -->
        </p:layoutUnit>

    </p:layout>
</h:body>

一切正常。我有两个问题:

  1. 我应该将 移动commandButton到另一个layoutUnit(输入)并且我无法将<h:form>元素放置在合理的位置。我尝试将它移到旁边<p:layout>,使其包含所有布局单元,但它损坏了(更新的页面不再具有“更新。”字符串)。

  2. 我想使用另一个 layoutUnit 上的按钮通过 ajax 执行更新。当我ajax="false"从全局表单元素中删除属性commandButton并设置属性时prependId="false",输出文本不会更新。

在此先感谢您的帮助

4

1 回答 1

3

我应该将 commandButton 移动到另一个 layoutUnit(输入)并且我无法将<h:form>元素放置在合理的位置。我尝试将它移到旁边<p:layout>,使其包含所有布局单元,但它损坏了(更新的页面不再具有“更新。”字符串)。

我不确定我是否理解你的具体问题。只是做这样的事情?

<p:layoutUnit id="input" position="west">
    <p:panel header="">
        <p:tabView>
            <p:tab title="">
                <!-- INPUTS and SUBMIT BUTTON -->
            </p:tab>
        </p:tabView>
        <h:form>
            <p:commandButton value="Update !" action="#{testBean.update}" ajax="false" />
        </h:form>
    </p:panel>
</p:layoutUnit>

<p:layoutUnit id="output" position="center">
    <p:panel id="display" header="Information">  
        <h:outputText value="#{testBean.test}" />  
    </p:panel>
    <p:separator />
</p:layoutUnit>

我想使用另一个 layoutUnit 上的按钮通过 ajax 执行更新。当我从 commandButton 中删除 ajax="false" 属性并为全局表单元素设置 prependId="false" 属性时,输出文本不会更新。

updateID 必须是相对或绝对的客户端 ID 。至于如何计算正确的客户端 ID,请查看以下答案:How to find out client ID of component for ajax update/render? 找不到从“bar”引用的表达式“foo”的组件

PrimeFaces 布局组件不是 a NamingContainer,因此它的 ID 不会被添加到前面,并且一旦您<h:form>取出中心布局,就<p:panel id="display">可以通过命令按钮访问:display。因此,这应该这样做:

<p:layoutUnit id="input" position="west">
    <p:panel header="">
        <p:tabView>
            <p:tab title="">
                <!-- INPUTS and SUBMIT BUTTON -->
            </p:tab>
        </p:tabView>
        <h:form>
            <p:commandButton value="Update !" action="#{testBean.update}" update=":display" />
        </h:form>
    </p:panel>
</p:layoutUnit>

<p:layoutUnit id="output" position="center">
    <p:panel id="display" header="Information">  
        <h:outputText value="#{testBean.test}" />  
    </p:panel>
    <p:separator />
</p:layoutUnit>
于 2012-09-03T00:34:23.400 回答