你从来没有告诉过<f:ajax>
要渲染当前的输入组件。添加@this
到render
属性。
<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 属性,例如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>