[英]JSF Ajax Update not updating the component
以下是方案。 我的左側面板包含所有菜單項。 當我單擊菜單項時,應將相應的頁面加載到中央/主面板中,而無需刷新頁面。 因此,當單擊菜單項時,我使用ajax(setupdate方法)加載頁面。
我的要求是我要為某些菜單項集加載同一頁面。 但是基於菜單項的選擇,我需要從數據庫中檢索記錄,因此頁面布局保持不變。 但是我為所有菜單項提供了相同的頁面。 僅第一次將調用發送到支持Bean,而對於隨后的單擊,將不對支持Bean進行任何調用,並且將提供相同的頁面。
我正在使用PrimeFaces 3.4.1和JSF 2.0
注意:我正在動態加載屏幕。 在“客戶端”頁面中,我使用#{menuMB.screenName}動態加載屏幕。
以下是代碼段。
<f:view contentType="text/html; charset=UTF-8" encoding="UTF-8" >
<div id="outerWrapper">
<div id="contentWrapper">
<div id="leftPanel">
<div class="companylogo">
</div>
<div class="jsmenu">
<ui:insert name="leftPanel">
</ui:insert>
</div>
</div>
<div id="mainContentWrapper">
<div id="pageHeader">
<ui:insert name="pageHeader">
</ui:insert>
</div>
<div id="mainContent">
<div id="mainStyle">
<ui:insert name="mainContent">
</ui:insert>
</div>
</div>
</div>
<div class="clearFloat"></div>
</div>
<div class="clearFloat"></div>
<div id="footer">
<ui:insert name="footer">
</ui:insert>
</div>
</div>
</f:view>
所有頁面都加載在mainContentForm內部的mainOutputPanel內部。 我正在獲取需要從支持bean menuMB加載的屏幕名稱。
<h:body>
<ui:composition template="/pages/protected/templates/layoutTemplate.xhtml">
<ui:define name="pageHeader">
<ui:include src="/pages/protected/templates/loginHeader.xhtml">
</ui:include>
</ui:define>
<ui:define name="leftPanel">
<h:form id="leftMainForm">
<ui:include src="/pages/protected/templates/requestfactoryleft.xhtml">
</ui:include>
</h:form>
</ui:define>
<ui:define name="mainContent" >
<h:form id="mainContentForm" enctype="multipart/formdata" prependId="true">
<h:panelGroup id="mainOutputPanel" layout="block" >
<ui:include src="#{menuMB.screenName}">
</ui:include>
</h:panelGroup>
</h:form>
</ui:define>
<ui:define name="footer">
<ui:include src="/pages/protected/templates/footer.xhtml">
</ui:include>
</ui:define>
</ui:composition>
</h:body>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com /jsp/jstl/core">
<div class="testmenu" style="padding:7px;
border-radius: 10px 10px 10px 10px; margin-top: 7px;
background: darkgray; width: 187px;">
<div id="rfMainMenu">
<p:panelMenu id="rfleftMainMenu" model="#{menuMB.mnuModel}" >
</p:panelMenu>
</div>
</div>
</ui:composition>
@SessionScoped
@ManagedBean(name = "menuMB")
public class MenuMB implements Serializable {
@PostConstruct
public void loadMenu() {
if (getLoggedUser() != null) {
fmList = loginService.getMenuForUser(getLoggedUser());
}
//Call createMenu method to populate the sub menu and menu items
createMenu(fmList);
}
public void loadScreensForUser(ActionEvent event) {
MenuItem menuItem = (MenuItem) event.getComponent();
String attrName;
try {
if (menuItem != null) {
selectedMenuItem = menuItem.getId();
//Get the screen name from the properties file
menuUrl = RequestFactoryContextUtil.getResourceBundleString(menuItem.getId());
//Set the screen name to be displayed
setScreenName(menuUrl);
//Call update to update the form
RequestContext.getCurrentInstance().update("mainContentForm:mainOutputPanel");
}
}
catch (Exception exc) {
}
}
private void createMenu(List<FunctionMaster> fmList) {
//Submenu rfSubMenu = new Submenu();
try {
if (fmList != null) {
for (FunctionMaster sub : fmList) {
if (sub.getParentFunctionID() == 0) {
Submenu rfSubMenu = new Submenu();
rfSubMenu.setLabel(sub.getScreenDisplayName());
getMnuModel().addSubmenu(rfSubMenu);
for (FunctionMaster item : fmList) {
if (item.getParentFunctionID() != 0) {
if (item.getParentFunctionID() == sub.getFunctionID()) {
MenuItem rfSubItem = new MenuItem();
rfSubItem.setId(item.getFunctionName() + item.getFunctionID().toString());
rfSubItem.setValue(item.getScreenDisplayName());
rfSubItem.setImmediate(true);
rfSubItem.setUpdate(":mainContentForm:mainOutputPanel");
rfSubItem.setAjax(true);
rfSubItem.setRendered(true);
rfSubItem.setIcon("search");
//rfSubItem.setIcon("ui-icon-search");
ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
//rfSubItem.setActionExpression(factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), #{menuMB.loadScreenFromMenu}", Void.class, new Class[]{ActionEvent.class}));
MethodExpression methodExpr = factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), "#{menuMB.loadScreensForUser}", Void.class, new Class[]{ActionEvent.class});
MethodExpressionActionListener actionListener = new MethodExpressionActionListener(methodExpr);
rfSubItem.addActionListener(actionListener);
rfSubMenu.getChildren().add(rfSubItem);
//addMenuItem(rfSubItem);
}
}
}
//mnuModel.addSeparator(new Separator());
}
}
}
} catch (Exception ex) {
String excep = ex.getMessage();
}
}
}
我注意到<h:body>
駐留在<ui:composition
之外,這將導致<h:body>
被丟棄....( <ui:composition
之外的任何內容都將被忽略)
我建議您將<h:body>
標記放置在模板本身內
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.