Метод получения значения <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>
Другие вопросы по тегам