我现在使用的是 primefaces 3.3,但是这个版本不支持数据event="rawToggle"
表。所以我选择使用onExpandStart
而不是rowToggle
,但我遇到了另一个问题。在这里,我想将另一个数据表作为扩展行,所以每次我切换一行时nodetable
,我都需要传递该nodeId
行的backingbean
以获取该节点的所有内容。如果我有event="rowToggle
“,我可以毫无问题地做到!但是如果我使用onExpandStart
dataTable的属性,我就无法进入somenode.nodeId
,backingbean
有谁知道如何解决它?我也试过在<input type="hidden" name="hidden" value="#{somenode.nodeId}"/>
里面放一个隐藏的输入标签rowToggler
,但是我得到的值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>
我也尝试过另一种方式。节点的内容也是一个对象,在我定义的节点类中
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 都不会改变。但是如果我List<Content> contents = new ArrayList<Content>()
直接在 中定义nodeedit
,它可以得到新的值!!这就是为什么我nodeId
每次切换节点表然后更新backingbean
. 我做错了什么吗?