好的,试着缩短一点,把代码放在文章的末尾。谢谢你的回答。
在阅读了很多关于这个主题的问题/答案后,没有找到任何解决方案,这是我的问题。我尽量简洁,所以我可能会截断一些代码,请随意询问细节。我对JSF、primefaces世界也很陌生。
我基于Spring/Hibernate/Primefaces在现有web应用程序上开发改进/修复。用户界面包含一个选项卡视图,其中包含一些p:datatable:companies,在我的例子中是user。
下面是我的用例:
>
在“formCompany”中,一个按钮显示对话框“createCompany”。
我创建了一个公司'aaaa/aaaa'(名称和代码是社会实体的强制性要求)-
我创建了一个与该公司“john”/“aaaa”关联的用户(名称和公司是使用实体的必填字段)-
我将公司的名称修改为“bbbb”,并将其保存-
我怀疑userTable没有使用命令按钮的“更新”属性从数据库中刷新。我猜“: 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
<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的代码:
公司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)
...
}
}
提前谢谢你,祝你度过愉快的一天。
所以我用注入的豆子挖出了解决方案,并使其生效。
这个想法在那个链接中:我可以从
我不确定这个方法对注释是否很干净...
我在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() {
// ...
}
}
如果有任何改进,请随时提出建议。
您的问题是:“保存公司后,如何更新用户数据表?”
在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中,建议的方法是在修改状态以