簡體   English   中英

JSF Ajax Update不更新組件

[英]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>

客戶端XHTML

所有頁面都加載在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>

左XHTML(包含從數據庫動態加載的菜單)

<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>

支持bean(在選擇菜單項時動態加載頁面)

@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM