JSF Primefaces编辑弹出窗口中的行值null

时间:2013-05-25 09:06:14

标签: jsf jsf-2 primefaces

我正在使用JSF 2.0和Primefaces 3.4.2

由于某些奇怪的原因,当点击数据表中的行的命令按钮时,我无法在弹出对话框窗口中获取该值。不确定我做错了什么?

任何帮助都非常值得赞赏。

我在JSF页面中有以下内容

<p:dataTable id="dataTable" var="emp" lazy="true"
   value="#{myMB.lazyModel}" 
selection="#{myMB.selectedEmployee}"...>

<p:column>
<p:commandButton id="edit" update=":frmedit:editDlg" process="@this"
onmousedown="dlg.show()" icon="ui-icon-pencil"
title="Edit" >
<f:setPropertyActionListener value="#{emp}"
target="#{myMB.selectedEmployee}" />
</p:commandButton>
</p:column>

对话框代码

<h:form id="frmedit">
<p:dialog header="Employees" style="font-weight:bold"
widgetVar=Dialog" resizable="false" id="dlg"
showEffect="fade" hideEffect="fade" appendToBody="true"
modal="true" width="200" height="250">

<h:panelGrid columns="2" cellspacing="5">
<h:outputText value="Employee #" />
<h:outputText value="#{myMB.selectedEmployee.empNo}"
style="font-weight:bold" />
</h:panelGrid>

最后在ManagedBean中

@Named("myMB")
@ViewAccessScoped

private Employee selectedEmployee= new Employee();

使用getter和setter

更新1

<p:column>                          
<p:commandButton id="edit" update=":frmedit:display" process="@this"
title="View" 
icon="ui-icon-pencil"   style="border-width:0;background:none;"
onmousedown="Dialog.show()">
<f:setPropertyActionListener value="#{emp}"
target="#{myMB.selectedEmployee}" />
</p:commandButton>
</p:column>    


<p:dialog header="Employees" style="font-weight:bold"
widgetVar=Dialog" resizable="false" id="dlg"
showEffect="fade" hideEffect="fade" appendToBody="true"
modal="true" width="200" height="250">
<h:form id="frmedit">

<h:panelGrid id="display" columns="2" cellspacing="5">
<h:outputText value="Employee #" />
<h:outputText value="#{myMB.selectedEmployee.empNo}"
style="font-weight:bold" />
</h:panelGrid>
</h:form>
</p:dialog>

2 个答案:

答案 0 :(得分:2)

为什么会出现这种情况的三个主要原因是

  1. 该对话框实际上并未更新ajax

  2. 属性侦听器未设置该值。您可以通过向该属性的setter添加一些日志记录来轻松地调试它

  3. 实际上是重新创建了bean,并且根据您的重新初始化了selectedEmployee属性 行:

    Employee selectedEmployee= new Employee();
    
  4. 根据您对上一个答案的评论,对于具有相同值的同一对话框,您不应该widgetVarid

  5. 我的投票结果是(3)。您应该验证bean实际上没有被删除和重新创建(构造函数或@PostConstructor日志记录)。

答案 1 :(得分:0)

widgetVar="dlg"代替<p:dialog...>,根据此Example,您应致电

来自dialog属性

widgetVar

所以dlg.show()是指widgetVar="dlg"而不是id