JSF/PrimeFaces: проблема на страницах с макетом

У меня проблема с моей страницей JSF, которая использует компоненты PrimeFaces. Поскольку это может быстро стать длинным и скучным, я постараюсь быть максимально кратким. Рассмотрим этот управляемый компонент:

@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. Я хочу выполнить обновление через ajax с помощью кнопки на другом layoutUnit. Когда я удаляю атрибут ajax="false" из commandButton и устанавливаю атрибут prependId="false" для элемента глобальной формы, выходной текст не обновляется.

Заранее спасибо за помощь


person Arash Shahkar    schedule 02.09.2012    source источник
comment
Чтобы решить вторую проблему, я попытался полностью удалить тег формы и установить для атрибута обновления команды commandButton любую комбинацию, которую только мог придумать, включая: display, output: display, : output: display, и ни один из них не помог.   -  person Arash Shahkar    schedule 02.09.2012
comment
:layout:output:display тоже не работает.   -  person Arash Shahkar    schedule 03.09.2012


Ответы (1)


Мне нужно переместить 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>

Я хочу выполнить обновление через ajax с помощью кнопки на другом layoutUnit. Когда я удаляю атрибут ajax="false" из commandButton и устанавливаю атрибут prependId="false" для глобального элемента формы, выходной текст не обновляется.

Идентификатор update должен быть относительным или абсолютным идентификатором клиента. Что касается того, как определить правильный идентификатор клиента, проверьте этот ответ: Как узнать идентификатор клиента компонента для обновления/рендеринга ajax? Не удается найти компонент с выражением foo, на которое ссылается bar

Компонент макета PrimeFaces не является NamingContainer, поэтому его идентификатор не будет добавляться в начало, и как только вы уберете <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>
person BalusC    schedule 03.09.2012
comment
Большое Вам спасибо. Это помогло. Я действительно не знаю почему, но я думал, что форма также должна заключать в себе целевой элемент. - person Arash Shahkar; 03.09.2012