Метод получения значения <f: passThroughAttributes> не вызывается в фазе RENDER RESPONSE для запроса ajax
У меня возникла следующая проблема: привязка метода для тега <f:passThroughAttributes>
используется для заполнения компонента сквозными атрибутами, не вызывается для запроса AJAX.
<f:ajax execute="@this otherComponent"
listener="#{myController.doSomething}"
render="otherComponent">
<h:inputText id="myComponent" value="#{myModel.value1}">
<f:passThroughAttributes value="#{myController.getAttributesFor("myComponent")}" />
</h:inputText>
</f:ajax>
<h:inputText id="otherComponent" value="#{myModel.value2}"></h:inputText>
Почему это не называется?
1 ответ
Ты никогда не говорил <f:ajax>
для визуализации текущего компонента ввода, а также. добавлять @this
к render
приписывать.
<f:ajax ... render="@this otherComponent">
Это должно вызвать метод getter и произвести желаемый вывод HTML. Однако это вызовет новую проблему: атрибуты сквозного прохождения игнорируются сценарием обновления ajax Мохарры, см. Также строку 1419 и далее jsf.js
Mojarra 2.2.4, когда стадия проекта установлена Development
(не проверял MyFaces на этом):
1419 } else if (d.nodeName.toLowerCase() === 'input') {
1420 // special case handling for 'input' elements
1421 // in order to not lose focus when updating,
1422 // input elements need to be added in place.
1423 parserElement = document.createElement('div');
1424 parserElement.innerHTML = html;
1425 newElement = parserElement.firstChild;
1426
1427 cloneAttributes(d, newElement);
1428 deleteNode(parserElement);
1429 }
Таким образом, чтобы сохранить фокус ввода (например, при срабатывании во время keydown
), он не заменяет весь входной элемент визуализированным ajax, а только клонирует его атрибуты. Тем не менее cloneAttributes()
Функция только клонирует предопределенные атрибуты HTML, такие как id
, class
и т. д., а не по индивидуальному заказу и, конечно, не по сквозному Чтобы обойти это, оберните входной элемент в span и добавьте вместо него ajax-udpate:
<h:panelGroup id="foo">
<h:inputText id="myComponent" value="#{myModel.value1}">
<f:passThroughAttributes value="#{myController.getAttributesFor("myComponent")}" />
<f:ajax execute="@this otherComponent"
listener="#{myController.doSomething}"
render="foo otherComponent" />
</h:inputText>
</h:panelGroup>