p:在p:dialog

时间:2017-10-09 14:17:52

标签: java jsf primefaces

好的,试着缩短一点,把代码放在帖子的末尾。谢谢你的回答。

在阅读了关于这个主题的相当多的问题/答案而没有找到任何解决方案之后,这是我的问题。 我尽量简洁,所以我可能会截断一些代码,随时可以询问详细信息。 我对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 =>失败
  • 使用其widgetVar id从p:commanbButton.oncomplete到达userTable并调用假设'刷新/重新加载/更新'方法,使用PF(' userTable')=>失败(primefaces文档并没有真正帮助......)

以下是保存公司的按钮代码:

<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 &amp;&amp; !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 &amp;&amp; !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)
        ...
    }
}

提前感谢您,祝您度过愉快的一天。

2 个答案:

答案 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() {
        // ...
    }
}

如果可以做出任何改进,请随时提出建议。