Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax JSF(Primefaces)从表中更新_Ajax_Jsf_Primefaces - Fatal编程技术网

Ajax JSF(Primefaces)从表中更新

Ajax JSF(Primefaces)从表中更新,ajax,jsf,primefaces,Ajax,Jsf,Primefaces,我有一个datatable,其中包含删除行的按钮,我希望以后刷新该表。刷新效果很好,但我删除最后一项时除外。我相信这是因为呈现的属性在ajax更新中表现不好。 这一切都在一个复合组件中,datatable是有条件呈现的,看起来如下所示: <p:dataTable id="#{cc.attrs.id2}_resultTable" value="#{cc.attrs.listData}" var="f" render

我有一个datatable,其中包含删除行的按钮,我希望以后刷新该表。刷新效果很好,但我删除最后一项时除外。我相信这是因为
呈现的
属性在ajax更新中表现不好。 这一切都在一个复合组件中,datatable是有条件呈现的,看起来如下所示:

<p:dataTable id="#{cc.attrs.id2}_resultTable"
             value="#{cc.attrs.listData}"
             var="f"
             rendered="#{cc.attrs.list and not empty cc.attrs.listData}"
             rowKey="#{f.code}">
    ...columns
    <p:column>
        <p:commandButton action="#{myBB.removeItem}"
                         update="#{cc.attrs.id2}_resultTable">
            <f:setPropertyActionListener value="#{f}" target="#{myBB.selected}"/>
        </p:commandButton>
    </p:column>
</p:dataTable>
我可以使用组件的完整路径,但这有点问题,因为它是一个复合组件


有趣的是,更新是从表的外部进行的。但是,当我将其移动到表中的列时,它不会移动。

NeplatnyUdaj可能有这个正确的原因,它很可能是渲染属性。我通常使用的解决方案是创建一组包装器对象,然后刷新整个表

您的模型可能看起来像->

  List<Wrapper> data = ....;
  public class Wrapper implements Serializable
  {
      properties....
     public void onAction(ActionEvent evt) { removeMeFromList(); //..do something }
  }
列表数据=。。。。;
公共类包装器实现可序列化
{
财产。。。。
public void onAction(ActionEvent evt){removeMeFromList();/…do something}
}
在视图中,您只需直接引用包装器对象:

      <p:dataTable var="data" id="table"> ...
         <p:column>
           <p:commandButton actionListener="#{data.onAction}" update="table"/> 
           //Ajax updates here via the "Wrapper" object. 
           //Also, when there's complex business logic I find this 
           //easier to read (purely my preference).
         </p:column>
      ....
。。。
//Ajax在此通过“包装器”对象进行更新。
//此外,当存在复杂的业务逻辑时,我发现
//更容易阅读(纯粹是我的喜好)。
....
这并不优雅,但实际上非常容易使用(而且,如果您不关心内存中有很多对象,那么这是一种简单的处理方法)。因为您的操作侦听器在启动包装器对象时不必担心它,所以所有更新都发生在bean中,然后您的表将使用新模型更新

在本例中,我会根据列表的大小标记渲染,但这都是基于实现的


祝你好运,希望这对你有帮助。

你可以把
放在
里面,然后尝试更新div,即
tableDiv
,而不是
迪甘塔:我已经尝试过了(见问题的结尾),你可以通过这种方式更新复合组件
:j_idt111:test\u resultable
。将生成的
id
替换为您自己的
id
此j_idt111在复合组件之外,因此我无法控制它。但无论如何,它不起作用。在更新中,似乎除了表本身之外,我无法引用任何内容:``无法找到表达式为“:j_idt128:test_resultable”的组件,引用自“mainForm:j_idt128:test_resultable:0:j_idt145”。``我认为问题是,在执行操作和更新数据时,commandButton不再显示在视图中。感谢您的输入,但是隐藏表的重要性并不能证明对代码进行如此大的更改是正确的。但和往常一样,当我放弃的时候,我想出了一个简单有效的解决方案(实际上是在我写这篇文章的时候发生的)。我只是从commandButton调用一个
p:remoteCommand
,然后从那里更新封装的
h:panelGroup
),这是一个非常有效的解决方法。我在上面提出的解决方案通常是一种非常可靠的素数面设计模式(树模型等),因为我发现您遇到这些边缘情况的频率比您喜欢的要高。我将把这封信归档,作为处理它的诀窍——感谢您的回复。
      <p:dataTable var="data" id="table"> ...
         <p:column>
           <p:commandButton actionListener="#{data.onAction}" update="table"/> 
           //Ajax updates here via the "Wrapper" object. 
           //Also, when there's complex business logic I find this 
           //easier to read (purely my preference).
         </p:column>
      ....