Я пытаюсь написать составной компонент, который может установить фокус на первый 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