我有一个奇怪的情况,使用@parent,甚至显式id-s都不能在update属性中工作。但@form工作正常。
我做了一个非常简单的测试用例,其中包括一个简单的网格,其行为如下:
修改按钮如下:
<!-- this works, since it's using @form in the update attribute -->
<p:column>
<p:commandLink
value="modify record"
process="@this"
action="#{testUserBean.modifyRecord(user)}"
update="@form"
rendered="#{not testUserBean.isRecordModified(user)}" />
</p:column>
请注意,update属性使用@form使其工作:单击修改按钮时,它会重新呈现并消失。
用@this或@parent或网格的id替换它,然后它将无法工作。对我来说,在update属性中使用网格的id非常合乎逻辑,因为我想在点击buttton后刷新网格。
我尝试使用rowIndexVar="rowIndex"
和myGridId:#{rowIndex}:link
,但仍然无法使用。
<!-- this does not work -->
<p:column>
<p:commandLink id="link"
value="modify record"
process="@this"
action="#{testUserBean.modifyRecord(user)}"
update="tblUser"
rendered="#{not testUserBean.isRecordModified(user)}" />
</p:column>
以下是此简单示例的资源:
我正在使用tomcat 7,这些是我的依赖项:
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
也尝试了主要的3.0.M1,但它也有同样的行为。
请分享您的想法。这是一个错误还是我做错了什么?
更新
您好,
我刚刚完成了一些测试,但一切都还是失败了。
测试1(使用update=":gridRPBDetails"
):
JSF文件:
<p:commandLink id="undoLink" value="Undo" process="@this"
action="#{tInputBean.actionUndoRemoveRecord(rpbDetail)}"
update=":gridRPBDetails"
rendered="#{tInputBean.isRemoveRecord(rpbDetail)}"
title="Batalkan buang data" />
生成的xhtml:
<a title="Batalkan buang data" onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/TInput.xhtml',
{formId:'j_idt38',async:false,global:true,source:'gridRPBDetails:0:undoLink',
process:'gridRPBDetails:0:undoLink',update:':gridRPBDetails'});"
href="javascript:void(0);" id="gridRPBDetails:0:undoLink">Undo</a>
测试2(使用update=":gridRPBDetails:#{rowIndex}:undoLink"
):
JSF文件:
<p:commandLink id="undoLink" value="Undo" process="@this"
action="#{tInputBean.actionUndoRemoveRecord(rpbDetail)}"
update=":gridRPBDetails:#{rowIndex}:undoLink"
rendered="#{tInputBean.isRemoveRecord(rpbDetail)}"
title="Batalkan buang data" />
生成的xhtml:
<a title="Batalkan buang data" onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/TInput.xhtml',
{formId:'j_idt38',async:false,global:true,source:'gridRPBDetails:0:undoLink',
process:'gridRPBDetails:0:undoLink',update:':gridRPBDetails:0:undoLink'});"
href="javascript:void(0);" id="gridRPBDetails:0:undoLink">Undo</a>
在单击撤消按钮方面,两个测试仍然失败,无法刷新网格记录,甚至网格本身。
更新
我刚刚更新了我的测试:
<p:commandLink
value="modify record"
process="@this"
action="#{testUserBean.modifyRecord(user)}"
update=":mainForm:tblUser"
rendered="#{not testUserBean.isRecordModified(user)}" />
注意我使用了:mainForm:tblUser
,我尝试了其他选项但仍然失败了:
但我注意到的一件事是,无论我为更新选择什么,更新总是以 tblUser:0
结束<a onclick="PrimeFaces.ajax.AjaxRequest('/cashbank/faces/test.xhtml',
{formId:'mainForm',async:false,global:true,source:'tblUser:0:j_idt33',
process:'tblUser:0:j_idt33',
update:'tblUser:0'
});" href="javascript:void(0);" id="tblUser:0:j_idt33">modify record</a>
我尝试使用firebug将 tblUser:0 动态修改为 tblUser ,网格上的部分渲染效果很好。
我开始认为这是尝试从网格记录内更新网格时的错误。
答案 0 :(得分:4)
这已在here中得到解答。
以下是答案的引用:
这更像是一个mojarra问题,它应该与myfaces一起使用 没有包装。解决方法是放置一个包装器。
Code:
<h:form id="frm">
<p:outputPanel id="wrapper">
<p:dataTable id="tbl">
//...
<p:commandButton update=":frm:wrapper" />
//...
<p:dataTable>
<p:outputPanel>
</h:form>
对于最新的更新感到抱歉!
答案 1 :(得分:0)
查看生成的HTML。由于<p:commandLink>
位于<p:dataTable>
,因此其生成的客户端ID就是这样的
<a id="someformid:tblUser:0:link">
0
是表格行索引。
因此,当您在update="tblUser"
上使用相对标识符<p:commandLink>
时,它将基本上搜索someformid:tblUser:0:tblUser
进行更新。但这不存在。您希望使用绝对标识符,从:
开始。
<p:commandLink update=":someformid:tblUser">
答案 2 :(得分:0)
<p:dataTable id="mytable"
value="#{dataTableWithLinkBean.list}" var="item">
<p:column>
<f:facet name="header">
Code
</f:facet>
<p:commandLink actionListener="#{dataTableWithLinkBean.viewDetail}"
oncomplete="dlg.show()" process="@this"
update=":mainform:dialog_content">
<h:outputText value="#{item.code}"/>
<f:param name="code" value="#{item.code}"/>
</p:commandLink>
</p:column>
</p:dataTable>
<p:dialog widgetVar="dlg" modal="true" id="dialog"
width="300" height="300">
<h:panelGrid id="dialog_content">
<h:outputText value="#{dataTableWithLinkBean.selectedCode}"/>
</h:panelGrid>
</p:dialog>
上面是呈现对话框的数据表中链接的示例。 也许你可以尝试改变
更新= “的:MainForm中:dialog_content 强>”
到
更新= “的:MainForm中:mytable的强>”
在这种情况下,我的标签表单使用的是id mainform,如下所示:
请注意,我没有尝试过这个。我刚刚在上面的示例中使用了部分渲染对话框面板。祝你好运
<强>更新强> 好吧,我试试这样,结合您的更新帖子
<p:dataTable id="mytable"
value="#{dataTableWithLinkBean.list}" var="item">
<p:column>
<f:facet name="header">
Code
</f:facet>
<h:outputText value="#{item.code}"/>
</p:column>
<p:column>
<p:commandLink value="Modify"
action="#{dataTableWithLinkBean.removeDetail(item)}"
process="@this"
update="mytable"
rendered="#{not dataTableWithLinkBean.isModifier(item)}">
</p:commandLink>
</p:column>
</p:dataTable>
在支持bean中
public String removeDetail(ClassForTest item){
for(ClassForTest o: list){
if(o.equals(item)){
//do something update to database
item.setModified(true);
break;
}
}
return "";
}
public boolean isModifier(ClassForTest item){
return item.isModified();
}
它有效!点击修改按钮后,调用removeDetail方法,执行一些操作,更新修改后的状态。然后执行update =“mytable”,链接修改就不见了。
我正在使用Mojarra 2.0.4和primefaces 3.0.M2
仅供参考,我在支持bean中使用DataModel,只是一个简单的List 所以没有rowIndexVar。也许在使用DataModel时,可能会产生这个问题。