2011-12-15 6 views
1

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

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

<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, который включает составной компонент. Однако я не хочу принуждать пользователя включать параметр обновления в вызов компонента. Есть ли удобный способ сделать это?


Update

Хорошо, я думаю, что это могло бы помочь, если бы я показал полный тестовый пример. Я реализую 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; 
} 
} 

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

<!-- 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, но ответ не обновляет счетчик. Ни одно из различных значений для обновление или визуализации работ. В случае, показанном на кнопку primefaces, кажется, не делать ничего, в случае командной кнопки JSF я получаю диалоговое окно, в котором говорится:

malformedXML: During update: test2form:xyz not found 

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

+0

Хм, вы также попробовали '' вместо этого? – BalusC

+0

Это в моем списке, чтобы попробовать. Но какую форму для клиники вы использовали бы для атрибута render? @BalusC – AlanObject

+0

Может быть, вы можете поместить все в '

ответ

1

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

Вы правы, нет один HTML элемент в генерируемый HTML DOM дерева, которое имеет точно этот идентификатор. Содержание составного компонента само по себе не завернуто в некоторый общий 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 не работает для вас. Меня устраивает.

+0

Я думал, что попробовал это, но теперь я попробую его на своем тестовом примере и отчитаюсь. – AlanObject

+0

OK Я просто попробовал, и оба предложения работают на моем тестовом примере. Я могу получить обновление для внутреннего контейнера и «@form». Поэтому мне нужно будет вернуться к тому, почему он не работает в моем обычном приложении, но я подозреваю, что перед тем, как это сделать, я прочитал javascript PrimeFaces. Одна особенность - при использовании '@ form' я получаю сообщение об ошибке в журнале, говорящее« Не могу найти компонент с идентификатором »test2form« in view »- где test2form - это значение атрибута id моей формы. – AlanObject

+0

Это с Mojarra 2.1.4? Кстати, ваш избыточный метод getFamily() не нужен. Расширенный класс 'UINamingContainer' уже имеет ту же реализацию. Это необходимо только при реализации интерфейса «NamingContainer». – BalusC