【问题标题】:JSF Primefaces row value null in Edit popup window编辑弹出窗口中的 JSF Primefaces 行值为 null
【发布时间】:2013-05-20 19:48:35
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 尝试用户 oncomplete="Dialog.show()" 到位 onmousedown="dlg.show()"

标签: jsf jsf-2 primefaces


【解决方案1】:

出现这种情况的三个主要原因是

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

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

  3. bean 实际上已重新创建,selectedEmployee 属性已根据您的要求重新初始化 行:

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

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

【讨论】:

  • kolossus 我会尝试您的建议,并会回复您。
  • kolossus 我正在考虑您的建议。对于第 2 点,我在selectedEmployee 的设置方法中输入了一个日志,并且日志语句没有打印。此外,当我检查浏览器控制台时,单击编辑按钮时没有与服务器通信。那是因为它正在触发ajax方法吗?
  • @Polppan 您可能需要在此处发布更多 xhtml。我怀疑你的&lt;h:form/&gt;s 位置不好。以您的对话框为例,&lt;h:form/&gt; 包含您的对话框;这是使用对话框时的主要禁忌
  • kolossus 我已经将封闭的对话框与&lt;h:form&gt; 放在一起,并且我已经删除了将&lt;h:form&gt; 放在对话框中的那个。我在我的问题中添加了 mmy 修改代码作为更新 1。现在我能够在弹出窗口中获取选定的行值,但是我确实有一个小问题,即当我单击时,我总是获得所有后续行的第一行值查看按钮。这可能是什么原因?
  • kolossus 最后我设法让这个工作。我不确定这是否是一个错误,在您建议将&lt;h:form&gt; 放入对话框之后,它无法正常工作。所以我已经从onmousedown 更改为oncomplete 并且它开始完美地工作。感谢您的帮助,不胜感激。
【解决方案2】:

尝试widgetVar="dlg",而不是&lt;p:dialog...&gt;,根据这个Example你应该打电话

dialog 来自其widgetVar 属性

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

【讨论】:

  • 我改为引用widgetVar,但这并没有解决问题。
  • @Polppan: 试试这个update("ElementID") 而不是update(:frmedit:editDlg) 也确保给widgetVarid 两个不同的值
猜你喜欢
  • 2013-07-21
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 2015-10-27
相关资源
最近更新 更多