【发布时间】:2019-05-31 06:46:17
【问题描述】:
我的应用程序在 url 中有一个查询参数,用于在数据表中使用相同的 xhtml(所有动态内容)呈现不同的数据。
bean的作用域是会话作用域,数据表渲染所有数据,并且有很多输入元素可以打开不同的对话框。
如果我打开另一个发送不同查询参数的浏览器选项卡,数据表将完美呈现,但是如果我返回第一个选项卡,所有命令链接都不会调用操作,整个应用程序将开始非常不稳定。
根据我的研究,这是因为我更改了数据表中的数据,我尝试使用动态 ID、动态小部件名称对其进行命名,但似乎没有任何效果。
<f:metadata>
<f:viewParam name="param" value="#{moduleBean.param}"/>
<f:viewAction action="#{moduleBean.setup}" />
</f:metadata>
<c:set var="module" value="#{moduleBean.param}" />
<p:dataTable id="#{module}-dataTable" value="#{moduleBean.model[module]}" var="data">
<p:commandLink action="#{moduleBean.openModuleDetails}" update=":#{module}-searchDialog" oncomplete="PF('#{module}-searchWidget').show();">
<f:param name="module" value="#{module}" />
<f:param name="dataRow" value="#{data.dbKey}" />
</p:commandLink>
</p:dataTable>
@Named
@javax.faces.view.ViewScoped
public class ModuleBean implements Serializable {
private String param;
public void setup() throws IOException {
this.model.put(this.param, new LazyDataModel(this.param));
}
public Map<String, LazyDataModel> getModel() {
return model;
}
}
这会在每个选项卡中使用所有正确的 id 构建所有预期的 html,但是 JSF 仍然没有处理 commandlink 中的操作。不用说,如果我只使用一个浏览器标签,一切都会完美运行。
有时它会在链接中单击两次后开始工作,但在浏览器选项卡之间来回切换最终总是会崩溃。
向命令链接添加动作侦听器也没有解决问题。
关于如何使 JSF 将相同的数据表视为同一页面上的不同实体但具有不同参数的任何建议?
【问题讨论】:
标签: jsf primefaces datatable cdi