我遇到以下问题:不会为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>
为什么不叫它?
答案 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属性,例如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>