问题:如何更新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
)并在执行某个动作侦听器之后,我想更新完整的第一行。但是,如果我要这样做,那就完全破坏了结果:
更新前:
更新后:
正如人们在生成的HTML中看到的那样,它不会重新呈现所有tr
和td
标记,因此所有内容都会显示在表格的第一个“列”中:
解决方法:
更新
迄今为止的评论非常有用。我现在能够更新单行而无需了解其内部结构。我用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时,它也会引起问题。