对于ajax请求,在RENDER RESPONSE阶段不会调用<f:passthroughattributes value =“”>的getter </f:passthroughattributes>

时间:2013-12-04 17:55:28

标签: ajax jsf jsf-2.2 passthrough-attributes

我遇到以下问题:不会为AJAX请求调用用于使用passthrough属性填充组件的标记<f:passThroughAttributes>的方法绑定。

<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 个答案:

答案 0 :(得分:2)

您从未告诉<f:ajax>也渲染当前的输入组件。将@this添加到render属性。

<f:ajax ... render="@this otherComponent">

这必须调用getter方法并生成所需的HTML输出。但是,这会导致一个新问题:Mojarra的ajax更新脚本会忽略passthrough属性,当项目阶段设置为jsf.js时,也可以参见Mojarra 2.2.4的Development行1419和1419(didn')检查这个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属性,例如idclass等,而不是自定义的属性,并且肯定不是直通的。要解决此问题,请将输入元素包装在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>