【发布时间】:2012-08-21 20:04:59
【问题描述】:
我现在使用的是 primefaces 3.3,但这个版本不支持 event="rawToggle" 用于数据表。所以我选择使用onExpandStart而不是rowToggle,但是我遇到了另一个问题。这里我想把另一个数据表作为展开的行,所以每次我在nodetable 中切换一行时,我需要将该行的nodeId 传递给backingbean 以获取该节点的所有内容。如果我有event="rowToggle",我可以毫无问题地做到这一点!但是如果我使用dataTable的属性onExpandStart,我无法在backingbean中获取somenode.nodeId,有人知道如何解决吗?
我还尝试在rowToggler 中放置一个隐藏的输入标签<input type="hidden" name="hidden" value="#{somenode.nodeId}"/>,但我在backingbean 中得到的值为空。
已经研究了几天,但仍然没有任何想法。请帮帮忙!
<p:dataTable id="nodetable" value="#{nodeedit.list}" var="somenode"
styleClass="datatable" editable="true"
onExpandStart="#{nodeedit.toggle(somenode.nodeId)}" >
<p:ajax event="rowEdit" listener="#{nodeedit.save('node')}"/>
<p:column style="width:4%">
<p:rowToggler>
<h:form>
<input type="hidden" name="hidden" value="#{somenode.nodeId}"/>
</h:form>
</p:rowToggler>
</p:column>
<p:column>
<f:facet name="header">ID</f:facet>
<h:form>
<h:commandLink action="nodeedit">#{somenode.norder}</h:commandLink>
</h:form>
</p:column>
<p:column headerText="Name">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{somenode.title}" />
</f:facet>
<f:facet name="input">
<p:inputTextarea value="#{somenode.title}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit" style="width:50px">
<p:rowEditor />
</p:column>
<p:rowExpansion>
<p:dataTable id="contentId" var="content"
value="#{nodeedit.contents}" id="contents" editable="true">
<p:ajax event="rowEdit" listener="#{nodeedit.save('content')}"/>
<p:column headerText="Text" style="width:450px">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{content.text}" escape="false" />
</f:facet>
<f:facet name="input">
<p:inputTextarea value="#{content.text}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit" style="width:50px">
<p:rowEditor />
</p:column>
</p:dataTable>
</p:rowExpansion>
</p:dataTable>
我也尝试过另一种方法。 Node的Content也是一个对象,在Node Class中我已经定义了
List<LibContent> contents = new ArrayList<LibContent>();
所以,就像 siebzOr 所说的那样,我在我的 jsf 中写道:
<p:rowExpansion>
<p:dataTable var="content" value="#{somenode.content}">
**<p:ajax event="rowEdit" listener="#{nodeedit.save()}"/>**
<p:column>
<h:outputText value="#{content.someValue}" />
</p:column>
<!-- Other columns -->
</p:dataTable>
</p:rowExpansion>
在 backingbean nodeedit 中,我有
public void save() {
for (Content content : node.contents)
System.out.println("content.text");
}
我发现无论我在页面中做什么,content.text 都不会改变。但是如果我直接在nodeedit中定义List<Content> contents = new ArrayList<Content>(),就可以得到新的值了!!这就是为什么我每次切换节点表然后更新backingbean 中的内容时都尝试获取nodeId 的原因。我做错了什么吗?
【问题讨论】:
标签: datatable primefaces