Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf DataTable中的Primefaces CommandButton传输随机对象_Jsf_Primefaces_Datatable_Commandbutton - Fatal编程技术网

Jsf DataTable中的Primefaces CommandButton传输随机对象

Jsf DataTable中的Primefaces CommandButton传输随机对象,jsf,primefaces,datatable,commandbutton,Jsf,Primefaces,Datatable,Commandbutton,一般来说,我对PrimeFaces和JSF非常陌生,我找不到类似情况的主题。 我检查了我没有嵌套表单。似乎我遇到了一些奇怪的行为——至少我不知道它为什么会这样做;) 假设我有一张清单。类“Module”有一个列表。我的意图是在一个表中显示数据,并按模块和其下的行中的元素很好地分组。 我的愿望似乎实现了,但我发现这只是为了报告问题,所以不可选择。不幸的是,我需要知道在模块上运行“删除”或“编辑”等操作的选择。 我尝试在子表方面放置一个按钮,actionlistener在backingbean中设置

一般来说,我对PrimeFaces和JSF非常陌生,我找不到类似情况的主题。 我检查了我没有嵌套表单。似乎我遇到了一些奇怪的行为——至少我不知道它为什么会这样做;)

假设我有一张清单。类“Module”有一个列表。我的意图是在一个表中显示数据,并按模块和其下的行中的元素很好地分组。 我的愿望似乎实现了,但我发现这只是为了报告问题,所以不可选择。不幸的是,我需要知道在模块上运行“删除”或“编辑”等操作的选择。 我尝试在子表方面放置一个按钮,actionlistener在backingbean中设置当前对象,然后打开一个对话框提供进一步的操作(在所选模块上)。我起初认为它是有效的,但后来注意到,按下同一个按钮,一个随机的模块对象被转移到了backingbean中

<p:dataTable id="displayModules" var="displayModuleBean"
     value="#{displayModuleController.displayModuleBeans}"
     emptyMessage="Es existieren keine Module für diese Kampagne.">
     <p:row>
        <p:column headerText="Vermarkter" />
        <p:column headerText="Platzierung" />
        <p:column headerText="Umfeld" />
        <p:column headerText="Format(e)" />
        <p:column headerText="Startdatum" />
        <p:column headerText="Enddatum" />
        <p:column headerText="Abrechnungsart" />
     </p:row>

     <p:subTable id="displayModuleElements" var="displayModuleElement"
        value="#{displayModuleBean.moduleElements}"
        sortBy="#{displayModuleBean.module.name}" sortOrder="descending">
        <f:facet name="header" style="vertical-align: middle">
             #{displayModuleBean.module.name}

           <p:commandButton alt="Modul bearbeiten" icon="ui-icon-pencil"
              style="float:right"
              actionListener="#{displayModuleController.setSelectedDisplayModuleBean(displayModuleBean)}"
              oncomplete="displayModuleEditDialog.show();"
              update=":tabview:displayModulesDialogForm:editDisplayModules">
           </p:commandButton>
        </f:facet>

        <p:column headerText="Vermarkter">
           <h:outputText value="#{displayModuleElement.advertiserName}" />
        </p:column>
     </p:subTable>
  </p:dataTable>
我甚至尝试了一种解决方法,在每个选项卡上都有一个手风琴面板和数据表,但我最终还是出现了同样的奇怪行为。我还尝试在每一行中添加一个按钮来传输所选元素本身(不是父模块),但其工作方式完全相同

我到底错过了什么?如果有人能帮助我走上正确的道路,那就太好了;)

我正在使用: PrimeFaces4.0, MyFaces 2.1.13, ApacheTomcat 7.0.42

LG,
Ani

EL方法参数在表单提交期间动作方法解码时进行评估。在构建JSF组件树或生成其HTML输出时,不会对它们进行评估

为了确保计算正确的EL方法参数值,在这种特定情况下,您需要确保
{displayModuleControl.displayModuleBeans}
后面的模型在处理表单提交时与呈现(显示)表单时完全相同

为了实现这一点,支持bean必须是视图范围的,并且该模型的getter必须完全没有任何业务逻辑。如果您希望“在页面加载时”填充模型,则必须准备并填充一次性的init/action方法,例如
@PostConstruct
,如果您希望“在提交时”填充模型,则必须填充到action(侦听器)方法中

否则,模型可能会关闭,因为您首先排序,然后通过在getter方法中执行DB调用从DB重新加载模型,就像许多启动器一样


作为一种完全不同的替代方案,如果您无法确保模型的完整性,因此在显示表单和处理表单提交之间存在不兼容更改的风险,那么您可以使用
传递静态参数。它将在播放表单期间(在渲染响应期间),而不是在处理表单提交期间,准确地表示该值

例如



通过
@ManagedProperty(“{param.id}”)
externalContext.getRequestParameterMap().get(“id”)
并基于DB
find()转换回具体的
DisplayModuleBean
按ID。另请参见

如果您正在处理实体,您最好将唯一ID作为参数传递给BackingBean,编写一个选择方法,将ID作为参数,并将所选对象设置为
@WindowScoped
BackingBean的实例。然后访问实例,如下所示:

 #{myBean.instance.propertyName}

这样,您就可以确保使用了正确的实例。

很抱歉将其添加到注释中,但也许您在
方面会有更多的运气-就像这样:
如果
显示模块元素
显示模块bean
相反,那么您可以尝试
,但坦率地说不要认为它会改变任何东西。您是否将EL方法参数与静态参数(如
)混淆了?静态参数使用
toString()
进行计算,并在视图渲染期间内联到生成的HTML输出中。对于“完整”实体来说,这确实行不通。你的回答对现在的问题没有多大意义。确切地说,是现在的问题。她可以有一个ModalPanel来编辑选定的实例,并通过EL访问它。她必须使用
设置实例的ID,并调用
selectInstance()
方法。我希望这是有意义的。嗯,
没有任何区别。在处理表单提交期间仍将对其进行评估。只有当您没有传递方法参数的EL 2.2功能时,它才有用。好的,我的逻辑是1)。要在一个页面上有一个用于编辑当前实例和表的表单,编辑表单在模式面板中。2). 使用ajax在Backingbean中选择一个实例并更新编辑表单。3). 做一些编辑,并用另一个按钮持续编辑表单。我建议停止胡乱猜测,仔细阅读我的答案,包括它的链接,直到你得到“我终于明白了!”的兴奋。谢谢你的回复。我在SessionScope中有我的模型bean,这不是比ViewScope“高一级”吗(只要用户会话处于活动状态,就使用相同的实例)?我使用ViewScope进行了测试,但我担心,因为我使用了CDI,因此选择了javax.enterprise.context中的范围定义,而不是javax.faces.bean包,一切都像以前一样停止工作;)是的,但是如果模型在显示表单和处理表单提交之间通过其他方式进行了不兼容的更改,那么这个构造仍然会失败。好的,会话范围是可以的,我将确保交付完全相同的列表。谢谢你的建议,我会查一查,明白了。我的错误是将displayModuleBeans保留在树映射和getDisplayModuleBeans()中(调用的次数比我想象的要多)
<p:commandButton ... actionListener="#{displayModuleController.setSelectedDisplayModuleBean}">
    <f:param name="id" value="#{displayModuleBean.id}" />
</p:commandButton>
 #{myBean.instance.propertyName}