Jsf p:remoteCommand的更新属性如何工作
Primefaces 6.0。我知道应该使用p:remoteCommand的update属性来指定应该由AJAX更新的组件的clientID。我试图了解PF是如何工作的。与DataTable结合使用时,它似乎无法按预期工作。当我试图直接设置Jsf p:remoteCommand的更新属性如何工作,jsf,primefaces,datatable,Jsf,Primefaces,Datatable,Primefaces 6.0。我知道应该使用p:remoteCommand的update属性来指定应该由AJAX更新的组件的clientID。我试图了解PF是如何工作的。与DataTable结合使用时,它似乎无法按预期工作。当我试图直接设置update=“form:dataTable:2:bColumn”时,它没有效果。但是,这样做(在下面的代码中注释掉)RequestContext.getCurrentInstance().update(“form:dataTable:2:bColumn”)将
update=“form:dataTable:2:bColumn”
时,它没有效果。但是,这样做(在下面的代码中注释掉)RequestContext.getCurrentInstance().update(“form:dataTable:2:bColumn”)代码>将强制PF更新指定的输出文本
为什么会这样?我很乐意提供技术解释——我正试图通过调试PF Java/Javascript源代码来找到答案
<h:form id="form">
<p:remoteCommand name="remoteCall"
action="#{grid4.onEdit}"
update="form:dataTable:2:bColumn"
/>
<p:dataTable id="dataTable"
var="gridItem"
value="#{grid4.gridItems}"
editable="true" editMode="cell"
>
<p:ajax event="cellEdit"
oncomplete="remoteCall()">
</p:ajax>
<p:column headerText="A">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{gridItem.a}" /></f:facet>
<f:facet name="input"><p:inputText value="#{gridItem.a}"/></f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="B">
<h:outputText id="bColumn" value="#{gridItem.b}" />
</p:column>
</p:dataTable>
</h:form>
豆子
@ManagedBean
@视域
公共类Grid4{
private List gridItems=new ArrayList();
公共网格4(){
添加(新的GridItem(“1”、“a”、“b”));
添加(新的GridItem(“2”、“a”、“b”));
添加(新的GridItem(“3”、“a”、“b”));
}
public void onEdit(){
System.out.println(“onEdit()”);
gridItems.get(2.setB)(“更改值”);
//RequestContext.getCurrentInstance().update(“form:dataTable:2:bColumn”);
}
公共列表getGridItems(){
归还物品;
}
公共void setGridItems(列出gridItems){
this.gridItems=gridItems;
}
}
基本上,jsf ID和客户端ID是两种不同的东西(检查答案和帖子以更好地理解)
当您使用RequestContext.getCurrentInstance().update(“form:dataTable:2:bColumn”)时
该方法使用客户机id查找必须更新的组件,但是在p:remoteCommand
的update
属性的情况下,它需要的是jsf id,而不是生成的客户机id,因此更新无法工作。但是,primefaces支持更新组件,因此您可以在update
属性上使用客户端id,如update=“@(#yourlementID)”
让我首先指出,这不是特定于p:remoteCommand
的。您注意到的这种行为的原因很简单,尽管不是很明显,可能是因为它不幸不在PrimeFaces文档中
中的更新属性:
<p:remoteCommand name="remoteCall"
action="#{grid4.onEdit}"
update="form:dataTable:2:bColumn"
/>
应该工作,也应该工作
<p:remoteCommand name="remoteCall"
action="#{grid4.onEdit}"
update=":form:dataTable:2:bColumn"
/>
始终是绝对的,因此这里不需要冒号,它会找到从根开始的元素(需要“prefix”形式)您提供的解决方案不起作用。经过更多的调试,我发现remoteCommand被错误地翻译成HTML。在生成的HTML中,我可以看到remoteCall=function(){PrimeFaces.ab({s:“form:j_idt4”,f:“form”,u:“form:dataTable:bColumn”,pa:arguments[0]});}。请注意,缺少行编号。在调试了PF的源代码之后,它看起来像一个bug。代码首先通过查找组件(输出文本字段)生成此“clientId”。但在找到它之后,有一些副作用使clientId字段无效。这是一个separte问题。您问题中更新属性的值与我在回答中描述的方式不符。我不知道jquery选择器。非常感谢。
<p:remoteCommand name="remoteCall"
action="#{grid4.onEdit}"
update="dataTable:2:bColumn"
/>
<p:remoteCommand name="remoteCall"
action="#{grid4.onEdit}"
update=":form:dataTable:2:bColumn"
/>
RequestContext.getCurrentInstance().update("form:dataTable:2:bColumn");