简体   繁体   English

JSF 2更新Facelet外部和外部的组件

[英]JSF 2 Update Component Outside of Form and Outside of Facelet

I have a form in the <ui:insert name="content" /> When I save the data with ap:commandButton I can update the form and things within the <ui:insert name="content" />. 我在<ui:insert name =“content”/>中有一个表单当我使用ap:commandButton保存数据时,我可以更新<ui:insert name =“content”/>中的表单和内容。 But I am having trouble figuring out how to update components in the <ui:include src="/sections/menus/topMenu.xhtml"/> 但我无法弄清楚如何更新<ui:include src =“/ sections / menus / topMenu.xhtml”/>中的组件

Inside the topmenu I have a subview for a panel with links that get rendered depending on whether a person is logged in or not. 在topmenu中我有一个面板的子视图,其中的链接根据一个人是否登录而呈现。 when they are logged in I show their username. 当他们登录时,我会显示他们的用户名。 If I update the user name in the content part of the template, I want to update the ui so that the name in the menu also updates without a page refresh. 如果我更新模板内容部分中的用户名,我想更新ui,以便菜单中的名称也更新而不刷新页面。 But that is a fallback I can use too. 但这也是我可以使用的后备。 Refresh the page after update. 更新后刷新页面。 But would rather not. 但不愿意。 I'll post more code if you want but trying to keep it to a minimum to start. 如果你愿意,我会发布更多代码,但试图将其保持在最低限度。

  <h:body>
    <div id="wrap">
      <div title="Container">
          <ui:include src="/sections/base/header.xhtml"/>
        </div><!-- End of Banner -->

        <div id="baseTemplateTopMenu" title="Menu">
          <ui:include src="/sections/menus/topMenu.xhtml"/>
        </div><!-- End of Menu -->

        <div id="sbt_contentbody"> 

            <div title="Left Column">
              <ui:include src="/sections/base/leftsidebar.xhtml"/>
            </div> <!-- End of Left Column -->
            <div title="Content Column">
              <ui:insert name="content" />
            </div><!-- End of Centre Column -->
            <div title="Right Column">
              <ui:include src="/sections/base/rightsidebar.xhtml"/>
            </div><!-- End of Right Column -->

        </div>
        <div id="footer" title="Footer" class ="container">
          <ui:include src="/sections/base/footer.xhtml"/>
        </div><!-- End of Footer -->

      </div><!-- End of Container -->
  </h:body>

Below is the p:commandButton that saves the user info 下面是保存用户信息的p:commandButton

<p:commandButton id="id_SubmitUserInfoPrefs"
                    value="Update"
                    action="#{userPreferences.updateUserInfo()}" styleClass="bottom_margin_2em top_margin_2em">
    <f:ajax execute="@form" render="@form :topMenuLoginView:topMenuLoginForm" />
<!-- tried adding 'update=":"topMenuLoginView:topMenuLoginForm"' as well. -->

Below is in the menu part of the template. 下面是模板的菜单部分。

<f:subview id="topMenuLoginView">
    <h:form id="topMenuLoginForm" prependId="false">
        <ul>
            <h:panelGroup id="loginPanel" rendered="#{!user.loggedIn}">
                <li><h:outputLink value="javascript:void(0)" onclick="topMenuLoginDialog.show()" 
                                    title="login" styleClass="loginpanelclass">Log In</h:outputLink></li>
                <li><h:link value="Register" outcome="/registration/register.xhtml" /></li>
            </h:panelGroup>
            <h:panelGroup id="logoutPanel" rendered="#{user.loggedIn}">
                <li><h:link value="#{user.nickname}" outcome="#{navigationprops.userprefs}" /> </li>
                <li><p:commandLink action="#{webAuthenticationBean.logout}" 
                                    update=":topMenuLoginView:topMenuLoginForm">
                        Logout
                    </p:commandLink>
                </li>
            </h:panelGroup>
        </ul>
    </h:form>
</f:subview>

The general idea of referring to an element by ID is as following: 通过ID引用元素的一般想法如下:

Lets say we've got an element <p:commandButton> . 让我们说我们有一个元素<p:commandButton>

When the element is given no id JSF generates one: 当给出元素时,没有id JSF生成一个:

<button name="j_idt191" id="j_idt191" ....

If an element is nested in a container element like a form, JSF prefixes the ID with the ID of the form: 如果元素嵌套在像表单这样的容器元素中,JSF会在ID前面加上表单的ID:

JSF: JSF:

<h:form>
    <p:commandButton/>
</h:form>

HTML: HTML:

<form id="j_idt48">
    <button name="j_idt48:j_idt191" id="j_idt48:j_idt191" ....
</form>

When there is an element in another container you need to reference from the root element. 当另一个容器中有一个元素时,您需要从根元素引用。 This can be done using a " : " in front of the ID. 这可以使用ID前面的“ ”来完成。 Here is an example: 这是一个例子:

<p:commandButton id="button1" update=":form:button2" ...

<h:form id="form">
    <p:commandButton id="button2" update=":button1" ...
</h:form>

If you're not sure what ID JSF has assigned to your element, use something like FireBug to inspect the element and discover it's ID. 如果您不确定ID JSF为您的元素分配了什么,请使用类似FireBug的内容来检查元素并发现它的ID。

As far as your code, I don't think <f:subview> is generating a container element, thus you need to reference topMenuLoginForm using update=":topMenuLoginForm" . 至于你的代码,我不认为<f:subview>正在生成一个容器元素,因此你需要使用update=":topMenuLoginForm"来引用topMenuLoginForm


That being said, if you want to update an element using AJAX, use the update attribute. 话虽这么说,如果你想使用AJAX更新元素,请使用update属性。 See my example above. 见上面的例子。

to Update Component Outside of Form 更新表单之外的组件

<p:gmap center="36.890257,30.707417" zoom="13" type="ROADMAP" 
                style="width:600px;height:400px"
                model="#{mapBean.simpleModel}"
                onPointClick="handlePointClick(event);"
                widgetVar="cliMap" fitBounds="true"
                id="map">
            <p:ajax event="overlaySelect" listener="#{mapBean.onMarkerSelect}"  />
        </p:gmap>

        <p:dialog widgetVar="dlg" showEffect="fade">
            <h:form prependId="false" id="formnew">
                <h:panelGrid columns="2">
                    <f:facet name="header">
                        <p:outputLabel value="New Point"/>
                    </f:facet>
                    <h:outputLabel for="title" value="Title:" />
                    <p:inputText id="title" value="#{mapBean.title}" />

                    <f:facet name="footer">
                        <p:commandButton value="Add" actionListener="#{mapBean.newPoint()}" update=":map" oncomplete="markerAddComplete()" />
                        <p:commandButton value="Cancel" onclick="return cancel()" />
                    </f:facet>
                </h:panelGrid>
                <h:inputHidden id="Nlat" value="#{mapBean.lat}"  />
                <h:inputHidden id="Nlng" value="#{mapBean.lng}" />

            </h:form>
        </p:dialog>

i used update=":map" to update the google map out of the form Using Primefaces 我使用update =“:map”从表格中更新谷歌地图使用Primefaces

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM