Как найти параметр update / render внутри составного компонента? - PullRequest
1 голос
/ 15 декабря 2011

У меня есть составной компонент, который использует ajax для изменения нескольких элементов при выборе элемента.Я также использую Primefaces p: ajax и p: commandButton вместо f: ajax , если это имеет какое-либо значение.

Проблема заключается вЯ не могу найти правильный атрибут update для использования с компонентами, чтобы весь компонент обновлялся.Например, в следующей кнопке:

<p:commandButton id="slGoUSA"
         value="USA" 
         rendered="#{cc.USAButtonOn}"
         actionListener="#{cc.doSetUSA}"
         update="???"  />

Я перепробовал все следующие и ни одна из них не работает:

update="@this"
update="@form"
update="#{cc.clientId}"
update=":#{cc.clientId}"
update="#{cc.clientId}:localID"
update=":#{cc.clientId}:localID"

Единственное, что работает это:

update="#{cc.attrs.update}"

и затем клиентская страница передает некоторый clientId, который включает составной компонент.Однако я не хочу заставлять пользователя включать параметр обновления в вызов компонента.Есть ли удобный способ сделать это?

Обновление

Хорошо. Думаю, это может помочь, если я покажу полный тестовый пример.Я реализую UINamingContainer для поддержки составного компонента следующим образом:

/*
 * Test code
 */
package com.myapp.app.component;

import java.io.Serializable;
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;

@FacesComponent(value="qctest")
public class Qctest extends UINamingContainer implements Serializable {

private enum StateKey { Counter }

public Qctest() { }

@Override
public String getFamily() { return "javax.faces.NamingContainer"; }

public Integer getCounter() {
    Integer i = (Integer) getStateHelper().get(StateKey.Counter);
    if (i == null) i = Integer.valueOf(1);
    else i += 1;
    getStateHelper().put(StateKey.Counter, i);
    return i;
}
}

Тогда определение cc выглядит следующим образом:

<!-- INTERFACE -->
<cc:interface componentType="qctest">
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>

    <h:outputText id="outText" value="Counter is now: #{cc.counter}" />
    <br/>
    <p:commandButton value="Hit Me" update=":#{cc.clientId}" />
    <br/>
    <h:commandButton value="Or Hit Me" >
        <f:ajax render=":#{cc.clientId}"/>
    </h:commandButton>

</cc:implementation>
</html>

Этот код в основном является OMG моей первой страницей AJAX!приложение, за исключением того, что оно находится внутри составного компонента вместо обычной страницы с обычным компонентом поддержки.

Ни одна из кнопок не может выполнить обновление.Firebug показывает отправляемый XHR, но ответ не обновляет счетчик.Ни одно из различных значений update или render не работает.В показанном случае кнопка «Primefaces», кажется, ничего не делает, в случае кнопки «JSF» я получаю диалоговое окно, которое гласит:

malformedXML: During update: test2form:xyz not found

Мне кажется, это наиболее тривиальное использование AJAXвнутри составного компонента.Кто-нибудь может объяснить, что может происходить?

1 Ответ

1 голос
/ 16 декабря 2011

malformedXML: Во время обновления: test2form: xyz не найден

Вы правы, в сгенерированном дереве HTML DOM нет ни одного элемента HTML, который бы имел именно этот идентификатор.Содержимое составного компонента само по себе не заключено в какой-то общий элемент HTML, доступный для JavaScript.В основном вам нужно было бы ввести какой-нибудь контейнерный компонент:

<cc:implementation>
    <h:panelGroup id="container">  
        ...
        <h:commandButton value="submit">
            <f:ajax render="container" />
        </h:commandButton>
        ...
        <p:commandButton value="submit" update="container" />
        ...
    </h:panelGroup>
</cc:implementation>

Но я все еще удивляюсь, почему @form не сработал для вас.У меня это работает.

...