Составной компонент воссоздан во время RENDER_RESPONSE - PullRequest
0 голосов
/ 19 марта 2011

Я пытаюсь написать составной компонент, который может установить фокус на первый UIINput, который не прошел проверку.

Моя проблема в том, что RENDER_RESPONSE воссоздает мой составной компонент из его xhtml, а не просто кодирует экземпляр, который я обновляю во время PROCESS_VALIDATIONS. Я использую Mojarra 2.0.4 (FCS b09)

Составная реализация

<h:outputScript name="jfocus.js" library="js" target="head"/>
<h:panelGroup layout="span" id="jimo-FocusMgr">
    <script type="text/javascript">
        jimo.FocusMgr.request("#{cc.attrs.target}");
    </script>
</h:panelGroup>

Следующий код в моем слушателе - это то, что устанавливает целевой атрибут составного объекта во время After PhaseId.PROCESS_VALIDATIONS и добавляет дочерний (только) составного объекта в список renderIds. Выходные данные отладки показывают, что prevEntry - это значение, которое использующая страница установила в компонент, а failId - это clientId () недопустимого UIInput.

//set the target attribute of the composite component  
Object prevEntry = mgr.getAttributes().put("target", failedId);  
if(log.isDebugEnabled())  
  log.debug("Set mgr's target attribute='"+failedId  
      +"', previously='"+(prevEntry==null ? "null" : prevEntry.toString()+"'"));  

PartialViewContext pvc = fc.getPartialViewContext();
Collection<String> renderids = pvc.getRenderIds();
//update target has to be an official component in the DOM, so append the child panelGroup ID
if(!renderids.contains(mgr.getClientId()))
    pvc.getRenderIds().add(mgr.getClientId()+UINamingContainer.getSeparatorChar(fc)+MGR_ID);
//first invalid component wins
break;

Вызов mgr.getAttributes (). Get ("target") во время До PhaseId.RENDER_RESPONSE продолжает показывать failID, но тот же вызов во время После PhaseId.RENDER_RESPONSE показывает, что цель вернулась к значению страницы использования.

Это ошибка, или я злоупотребляю / неправильно использую композиты?

Любые указатели будут оценены

Jim

1 Ответ

0 голосов
/ 21 марта 2011

Составное злоупотребление.

Вы не можете программно изменить значение cc.attrs - оно не извлекается с помощью карты атрибутов Uamingomponent NamingContainer.

Подправил реализацию, чтобы cc.attr ссылался на свойство managedBean, которое я использую c: set для инициализации в составном xhtml, и которое может свободно обновляться в моем слушателе через его установщик.

...