如何更新p:panelgrid中的特定行?

时间:2016-09-02 06:46:31

标签: jquery jsf primefaces

问题:如何更新p:panelGrid的多个单行?

我目前正在创建一个包含p:panelGrid的复杂表格以及用于模板化的自定义facelet标记。在几个单元格中触发的某些事件需要更新表格的其他部分。能够一次更新完整的行非常方便。到目前为止,我只能更新单个单元格内的内容。

我的自定义标记:

<p:row id=#{rowid}>
   <p:column>
       <some:inputComponent>
           <p:ajax update=#{toupdate} />
       </some:inputComponent> 
   </p:column>
</p:row>

PanelGrid中的用法:

<p:panelGrid>
  <my:row value=#{foo} rowid="one" />
  <my:row value=#{bar} rowid="two" toupdate="one"/>
</p:panelGrid>

在第二行中更改某些Component(如我的情况下为p:spinner)并在执行某个动作侦听器之后,我想更新完整的第一行。但是,如果我要这样做,那就完全破坏了结果:

更新前:

enter image description here

更新后:

enter image description here

正如人们在生成的HTML中看到的那样,它不会重新呈现所有trtd标记,因此所有内容都会显示在表格的第一个“列”中:

enter image description here

解决方法:

  • 将每个Cell的内容包装在一个容器中并单独更新这些容器(这很好用,但是因为我必须知道另一行中每行的实现细节,所以非常难看)

更新

迄今为止的评论非常有用。我现在能够更新单行而无需了解其内部结构。我用styleClass属性替换了行的ID,并将styleClass属性添加到输入Component。

<p:row styleClass=#{rowid}>
   <p:column>
       <some:inputComponent styleClass="foo">
           <p:ajax update="@(.#{toupdate} .mysuffix)" />
       </some:inputComponent> 
   </p:column>
</p:row>

正如我所说,如果toupdate仅包含一个“ID”,这样可以正常工作,但我也希望能够以这种方式更新多行。我想像我这样使用我的组件:

<p:panelGrid>
   <my:row value=#{foo} rowid="one" />
   <my:row value=#{bar} rowid="two" />
   <my:row value=#{fobar} rowid="three" toupdate="one two"/>
</p:panelGrid>

(由于这与jQuery现在更相关,我也在这个问题上添加了jQuery标签。)

SOLUTION:

最终方法如下:

<c:set var="u" value="#{empty parentids ? parentids :
       of:concat(fn:join(fn:split(toupdate,' '), ' .mysuffix,'),' .mysuffix')}" />
// ....
update="@({u})"

这与Kukeltjes建议非常接近,唯一的问题是连接不会在最后一个值之后追加样式。当没有传递ID时,它也会引起问题。

0 个答案:

没有答案