1

我遇到以下问题:<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>

为什么不叫呢?

4

1 回答 1

2

你从来没有告诉过<f:ajax>要渲染当前的输入组件。添加@thisrender属性。

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

这必须调用 getter 方法并生成所需的 HTML 输出。但是,这将导致一个新问题:Mojarra 的 ajax 更新脚本忽略了传递属性,另请参阅jsf.js当项目阶段设置为时 Mojarra 2.2.4的第 1419 行和第四行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 属性,例如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>
于 2013-12-04T18:45:30.447 回答