【发布时间】:2011-05-10 04:54:02
【问题描述】:
我有一个奇怪的情况,在更新属性中使用@parent,甚至明确的 id-s 都不起作用。但@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 代替它,那么它将不起作用。对我来说,在更新属性中使用网格的 id 是非常合乎逻辑的,因为我想在单击按钮后刷新网格。
我尝试使用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>
也尝试了 primefaces 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,并且我尝试了其他选项但仍然失败:
- :mainForm:tblUser:
- :tblUser(当我没有定义表单名称时)
- :mainForm:tblUser:#{rowIndex}:linkId
但我注意到的一件事是,无论我选择什么进行更新,更新总是以 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,网格上的部分渲染工作正常。
当我尝试从网格记录中更新网格时,我开始认为这是一个错误。
【问题讨论】:
标签: jsf jsf-2 primefaces