Проблема с ajax в составном компоненте изначально отображается = false - PullRequest
2 голосов
/ 19 февраля 2011

Я столкнулся с проблемой использования Ajax в составных компонентах (в отличие от Ajaxification пользовательских компонентов с помощью атрибута clientBehavior).

Я столкнулся со старой проблемой назначения запроса ajax, который должен присутствоватьв DOM при первоначальной визуализации страницы.

Пользовательский компонент имеет некоторые внутренние взаимодействия ajax, но доступ к нему осуществляется из div, который изначально отображается = false, и ajax перестает работать, как правило, без каких-либо сообщений об ошибках вжурнал сервера.

Этот простой пример демонстрирует проблему.Если свойство showPanel изначально установлено в true, вы можете ввести какой-то текст, нажать на ссылку и увидеть текст, обновленный на экране - все в порядке.Если для showPanel установлено значение false, вы можете нажать кнопку Toggle, которая отображает панель, но ссылка «push» больше не работает.

Очевидно, что было бы полезно, если бы этот композит мог действовать как отдельный компонент, полностью отображаемый.

Кто-нибудь знает, есть ли способ обойти это?Я только что провел целую вечность, сочиняя полностью поющий весь танцевальный компонент, и в первый раз, когда я пытаюсь использовать его, он не работает!

Спасибо.

Mojarra 2.0.4 Glassfish 3.0.1IE8 / Chrome.

index.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:sqcc="http://java.sun.com/jsf/composite/sqcc"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form prependId="false">
            <h:panelGroup id="ajaxTarget">
                <h:panelGroup rendered="#{indexBean.showPanel}">
                    <sqcc:testcomp value="#{indexBean.text}"/>
                </h:panelGroup>
            </h:panelGroup>
            <h:commandButton value="Toggle" action="#{indexBean.togglePanel}">
                <f:ajax render="ajaxTarget"/>
            </h:commandButton>
        </h:form>
    </h:body>
</html>

resources / sqcc / testcomp.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:cc="http://java.sun.com/jsf/composite"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <!-- INTERFACE -->
    <cc:interface>
        <cc:attribute name="value"/>
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>
        <div id="#{cc.clientId}">
            <h:form prependId="false">
                <h:inputText id="input1" value="#{cc.attrs.value}"/>
                <h:outputText id="output1" value=" #{cc.attrs.value}"/><br/>
                <h:commandLink value="push">
                    <f:ajax execute="input1" render="output1"/>
                </h:commandLink>
            </h:form>
        </div>
    </cc:implementation>
</html>

IndexBean.java

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class IndexBean implements Serializable {

    public IndexBean() {
    }

    private boolean showPanel = true;
    private String text;

    public String togglePanel() {
        showPanel = !showPanel;
        return null;
    }

    public boolean isShowPanel() {
        return showPanel;
    }

    public void setShowPanel(boolean showPanel) {
        this.showPanel = showPanel;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

[конец]

1 Ответ

1 голос
/ 15 марта 2011

Не должен был действительно отвечать на мой собственный вопрос, но я вернулся к этому через несколько недель.Большая ошибка в моем первоначальном посте заключалась в том, что цель Ajax должна отображаться только не обязательно при загрузке первой страницы, как все знают.Должно быть, я устал.

Поведение, демонстрируемое моим тестовым приложением, согласно которому «ajax в составном компоненте» не будет работать, если внешний контейнер не был изначально визуализирован, действительно корректно и воспроизводимо, но толькоесли логика внутри реализации составного компонента находится внутри своей собственной формы.Выньте форму h: из cc, и все в порядке.

Брендан.

...