好的,试着缩短一点,把代码放在帖子的末尾。谢谢你的回答。
在阅读了关于这个主题的相当多的问题/答案而没有找到任何解决方案之后,这是我的问题。 我尽量简洁,所以我可能会截断一些代码,随时可以询问详细信息。 我对JSF,primefaces世界也很陌生。
我在基于Spring / Hibernate / Primefaces的现有Web应用程序上开发演进/修复。 用户界面包含一个tabview,其中包含一些p:datatable:companies,user in users。
所以这是我的用例:
在' formCompany'中,一个按钮显示对话框' createCompany'。
我创建了一家公司&aaaa / aaaa' (societeEntity必须使用名称和代码) - >该公司被添加到' CompaniesTable'
我创建了一个与该公司关联的用户' john' aaaa' (名称和公司是utilisateurEntity的必填字段) - >用户创建并显示在“用户表”中。公司名称' aaaa'
我将名称修改为' bbbb'该公司并保存 - >公司名称未在' userTable'
我怀疑使用“更新”不会从数据库中刷新userTable。 commandButton的属性。 我想这会更新'属性":panelBas:formUser:userTable"工作正常但只在客户端。
我期望包含用户的数据表将使用新的公司名称' bbbb'进行刷新。
我尝试过的技巧:
以下是保存公司的按钮代码:
<p:commandButton value="Save" update="companyNameMsg companyCodeMsg :panelBas:formCompany:CompaniesTable **:panelBas:formUser:userTable**" ajax="true"
actionListener="#{companyDialog.save}" icon="ui-icon-disk"
**oncomplete="if(args && !args.validationFailed) { PF('createCompany').hide(); }"** />
组件p:datatable似乎没有从服务器重新加载数据的方法。 所以问题是如何在支持bean中保存公司后更新我的用户数据表?
下面的代码显示了包含tabview,对话框,数据表......的xhtml页面。
main.xhtml
<p:tabView id="panelBas" widgetVar="wvPanelBas" activeIndex="#{searchDialog.activeIndex}">
<p:tab title="Companies">
<h:form id="**formCompany**">
<p:dataTable id="CompaniesTable" value="#{companyDialog.companyList}" var="item3" lazy="false"
tableStyle="text-align: center;width:auto" paginator="true" rowsPerPageTemplate="5,10,15,20,30,50,100" rows="15"
sortBy="#{item3.nom}" sortOrder="ascending" filteredValue="#{companyDialog.companyFilteredList}">
...
</p:dataTable>
</h:form>
</p:tab>
<p:tab title="Users">
<h:form id="formUser">
<p:dataTable id="userTable" widgetVar="wvUserTable" **value="#{userDialog.utilisateurList}"** var="item2" lazy="false"
tableStyle="text-align: center;width:auto" paginator="true" rowsPerPageTemplate="5,10,15" rows="10"
sortBy="#{item2.nom}" sortOrder="ascending" filteredValue="#{userDialog.utilisateurFilteredList}">
**<!-- This value is not updated when associated company's name is modified-->
<p:column filterBy="#{item2.societe.nom}" sortBy="#{item2.societe.nom}" headerText="Company">
<h:outputText value="#{item2.societe.nom}" />
</p:column>**
...
<p:column filterBy="#{item2.nom}" sortBy="#{item2.nom}" headerText="Nom" sortOrder="ascending">
<h:outputText value="#{item2.nom}" />
</p:column>
</p:dataTable>
</h:form>
</p:tab>
</p:tabView>
<!-- This dialog allows to modify company data -->
<p:dialog header="New Company" widgetVar="createCompany" id="createCompany" resizable="true" modal="true" width="500" showEffect="clip" hideEffect="clip">
<h:form>
...
<!-- Company modification form -->
<p:commandButton value="Save" update="companyNameMsg companyCodeMsg :panelBas:formCompany:CompaniesTable **:panelBas:formUser:userTable**" ajax="true"
actionListener="#{companyDialog.save}" icon="ui-icon-disk"
**oncomplete="if(args && !args.validationFailed) { PF('createCompany').hide(); }"** />
</h:form>
</p:dialog>
以下是bean的代码:
CompanyDialog.java
@Component("companyDialog")
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class CompanyDialog {
// Managed property used by datatable attribute 'value'
@ManagedProperty("#{companyList}")
private List<SocieteEntity> companyList;
// Managed property used by datatable attribute 'filteredValue'
@ManagedProperty("#{companyFilteredList}")
private List<SocieteEntity> companyFilteredList;
@ManagedProperty("#{societeEntity}")
private SocieteEntity societeEntity;
@Override
public void save() {
...
}
}
UserDialog.java
@Component("userDialog")
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserDialog {
// Managed property used by datatable attribute 'value'
@ManagedProperty("#{utilisateurList}")
private List<UtilisateurEntity> utilisateurList;
// Managed property used by datatable attribute 'filteredValue'
@ManagedProperty("#{utilisateurFilteredList}")
private List<UtilisateurEntity> utilisateurFilteredList;
@ManagedProperty("#{utilisateurEntity}")
private UtilisateurEntity utilisateurEntity;
public void recherche() {
// Fills the managed property utilisateurList (used by the datatable)
...
}
}
提前感谢您,祝您度过愉快的一天。
答案 0 :(得分:0)
您的问题是:&#34;如何在保存公司后更新我的用户数据?&#34;
在jsf对话框的按钮中试试这个:
np.clip(corr, -1, 1, out=corr)
在更新目标中首先全部,尝试使用@form,如果不起作用,请使用@all
如果不起作用,请尝试使用imediate =&#34; true&#34;,imatiate true,这将改变订单生命周期,如果在sugestions不起作用之前可能解决您的问题。我认为你的问题很简单,你不应该写很多文字。
答案 1 :(得分:0)
所以我用注入的bean挖掘了解决方案并使其工作。
这个想法就在那个链接中:Can I call multiple methods from <p:ajax event=select listner=method1, metho2>?。
我不确定这种方法对于注释是否非常干净......
我在CompanyDialog bean中注入了UserDialog bean,如下所示:
@Component("companyDialog")
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class CompanyDialog {
@Inject
private UserDialog userDialog;
// When I update a company, the list userDialog.utilisateurList of users is reloaded in userDialog
public void save() {
// ...
userDialog.recherche();
}
}
@Component("userDialog")
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserDialog {
@ManagedProperty("#{utilisateurList}")
private List<UtilisateurEntity> utilisateurList;
// Fills the list utilisateurList
public void recherche() {
// ...
}
}
如果可以做出任何改进,请随时提出建议。