Jsf p:remoteCommand的更新属性如何工作

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”)将

Primefaces 6.0。我知道应该使用p:remoteCommand的update属性来指定应该由AJAX更新的组件的clientID。我试图了解PF是如何工作的。与DataTable结合使用时,它似乎无法按预期工作。当我试图直接设置
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");