当前位置: 首页 > 知识库问答 >
问题:

p:对话框中的数据修改后未正确刷新

孙星鹏
2023-03-14

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

在阅读了很多关于这个主题的问题/答案后,没有找到任何解决方案,这是我的问题。我尽量简洁,所以我可能会截断一些代码,请随意询问细节。我对JSF、primefaces世界也很陌生。

我基于Spring/Hibernate/Primefaces在现有web应用程序上开发改进/修复。用户界面包含一个选项卡视图,其中包含一些p:datatable:companies,在我的例子中是user。

下面是我的用例:

>

  • 在“formCompany”中,一个按钮显示对话框“createCompany”。

    我创建了一个公司'aaaa/aaaa'(名称和代码是社会实体的强制性要求)-

    我创建了一个与该公司“john”/“aaaa”关联的用户(名称和公司是使用实体的必填字段)-

    我将公司的名称修改为“bbbb”,并将其保存-

    我怀疑userTable没有使用命令按钮的“更新”属性从数据库中刷新。我猜“: panelBas: formUser: userTable”上的“更新”属性工作正常,但仅在客户端。

    我期望的是,包含用户的数据表将用新的公司名称“bbbb”刷新。

    我尝试的技巧:

    • 更新p上的属性:commandButton=

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

    <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

    <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的代码:

    公司ialog.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() {
            ...
        }
    }
    

    用户对话框。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个答案

    赵选
    2023-03-14

    所以我用注入的豆子挖出了解决方案,并使其生效。

    这个想法在那个链接中:我可以从

    我不确定这个方法对注释是否很干净...

    我在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() {
            // ...
        }
    }
    

    如果有任何改进,请随时提出建议。

    季稳
    2023-03-14

    您的问题是:“保存公司后,如何更新用户数据表?”

    在jsf对话框中的按钮中尝试以下操作:

    <h:commandButton id="ok" value="OK">
        <p:ajax click="messagesDialog.hide()" 
        update="@all"/>
    </h:commandButton>
    

    在update target first all中,尝试使用@form,如果不起作用,则使用@all

    如果不起作用,请尝试使用imeate="true",imatiate true,这将改变订单生命周期,如果之前的建议不起作用,也许可以解决您的问题。我认为您的问题很简单,您不应该写太多文本。

     类似资料:
    • 我有一个通过数组工作的代码,实际上我希望传入ArrayList。 下面是示例: 这是我现在的改编... 我不明白我的错误??我不知道正确的语法... 有关信息,这里的代码 大体上 非常感谢你的帮助。

    • 我有一个片段,它添加了一个选项到选项菜单。当单击此选项时,将打开一个对话框片段。对话框将原始片段设置为其目标片段。如果在对话片段打开时没有发生方向变化,则目标片段与预期的一样,但是在方向变化之后,目标片段被设置为对话片段本身,而不是先前设置的片段。结果,当试图将目标片段强制转换为被设置为目标片段的片段时,我得到了一个classCastException。我需要在对话框中获取目标片段,因为它实现了一

    • 在更改屏幕之前,我试图向用户显示带有对话框的成功消息。我希望它等待用户单击ok按钮或按Enter键,然后更改屏幕。由于我必须在程序中放置大量对话框,为了避免重复,我尝试在MainClass中使用一个createDialog方法来创建对话框,并将其添加到我传递给该方法的阶段。但问题是,我希望它将屏幕更改为用户按下ok按钮后传递给它的屏幕,但dialog的结果函数是一个内部方法,它不访问我传递给函数的

    • 我想使用一个p:对话框,其中包含一些commandbutton,但我不能从命令按钮调用我的bean,也不知道为什么。 在xhtml页面上有两个表单,第一个表单包含一些内容,如面板、panelgrids、按钮等。第二个表单只包含我的对话框。 我的beanHandler(beanHandler)是ViewAccessScoped。此xhtml页面上的所有内容都在工作,只有我的p:面板不工作 如果我使用

    • 这是我的对话里面的片断,它工作良好,现在我想当我点击“确定”按钮,它重新载入当前的片断。调用showDialog方法时显示对话框:mi fragment is android.support.v4.app.fragment 更新这是片段。我想回顾片段的onCreateView方法 使用viewpager和FragmentPagerAdapter测试

    • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,它可能导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态以