JSF 组件不是从我的 p:commandButton 在包含页面的对话框中呈现的
JSF component is not rendered from my p:commandButton in in a dialog in included page
我的页面包含我通过 ui:include 添加的登录名 header。包含的页面包含一个带有 p:commandButton 的对话框。当用户登录时,根据update属性中的@form正确刷新include页面。我还想更新包含页面之外的组件,该组件在用户登录时显示一个按钮。包含页面刷新并显示登录用户的名称。但是主页面上的按钮没有显示。如果我刷新页面,它就会显示。我不知道我在这里做错了什么。任何人都有任何想法。
header 页面也正确显示了 commandLink 组件。但是当点击注销link时,主页中的按钮并没有被移除。由于 commandLink 不使用 ajax,我假设完成了一个普通页面 POST。哪个应该重新加载整个页面。这不适用于 ui:include 引用的页面吗?
登录页面正在使用 session 作用域辅助 bean。主页是视图范围的。
这是包含的 xhtml (login.xhtml):
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<div style="width:100%;font-size:12px;line-height:20px;background-color:#b0d9e6;color:white">
<h:form>
<h:message id="top_msg"></h:message>
<h:panelGrid width="100%" columns="3" columnClasses="none,right1,right1">
<h:outputLink rendered="#{!loginController.loggedIn}" styleClass="text-align:right;" value="javascript:void(0)" onclick="PF('dlg').show();" title="login">
<p:outputLabel>Login</p:outputLabel>
</h:outputLink>
<h:commandLink rendered="#{loginController.loggedIn}" action="#{loginController.logout}" styleClass="text-align:right;" >
<h:outputLabel>Logout</h:outputLabel>
</h:commandLink>
<p:growl id="growl" sticky="true" showDetail="true" life="3000" />
<p:dialog header="Login" widgetVar="dlg" resizable="false">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="username" value="Username:" />
<p:inputText id="username" value="#{loginController.username}" required="true" label="username" />
<h:outputLabel for="password" value="Password:" />
<p:password id="password" value="#{loginController.password}" required="true" label="password" />
<f:facet name="footer">
<p:commandButton value="Login"
update="@form :createform:createbutton"
actionListener="#{loginController.login}"
oncomplete="handleLoginRequest(xhr, status, args)" >
</p:commandButton>
</f:facet>
</h:panelGrid>
</p:dialog>
</h:panelGrid>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args)
</script>
</h:form>
</div>
</ui:composition>
...
这个包含在以下主页中:
...
<ui:include src="login.xhtml" />
<h:form id="createform">
<h:panelGroup id="createbutton" layout="block">
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
</h:panelGroup>
</h:form>
您不能重新渲染未渲染的组件。如果您部分呈现一个按钮,但该按钮未呈现,则无法调用该按钮的更新,因为它不存在于 DOM.
您必须调用父命名容器的 AJAX 更新,它始终呈现。因此,更新 :createform 而不是里面的按钮。表单始终呈现,无论如何。
我发现了问题。在我的 commandButton "createnew" 中,我使用了错误的值进行渲染。
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
它应该使用我的会话作用域 bean (loginController) 来检查用户是否登录。更改为以下工作。
<h:panelGroup id="createbutton">
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{loginController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
</h:panelGroup>
注意区别 rendered="#{loginController.login ...} 而不是 rendered="#{recepieController.loggedIn}"
recepieController 也有一个我设置的 loggedIn 属性,但由于页面没有重新发布,我猜我登录时该属性的值没有改变。
但是,我相信我测试过在 p:commandButton 中使用 ajax="false" 作为登录对话框,我想这应该重置我的 loggedIn 属性的视图范围版本。我不完全明白为什么那行不通。
我的页面包含我通过 ui:include 添加的登录名 header。包含的页面包含一个带有 p:commandButton 的对话框。当用户登录时,根据update属性中的@form正确刷新include页面。我还想更新包含页面之外的组件,该组件在用户登录时显示一个按钮。包含页面刷新并显示登录用户的名称。但是主页面上的按钮没有显示。如果我刷新页面,它就会显示。我不知道我在这里做错了什么。任何人都有任何想法。
header 页面也正确显示了 commandLink 组件。但是当点击注销link时,主页中的按钮并没有被移除。由于 commandLink 不使用 ajax,我假设完成了一个普通页面 POST。哪个应该重新加载整个页面。这不适用于 ui:include 引用的页面吗?
登录页面正在使用 session 作用域辅助 bean。主页是视图范围的。
这是包含的 xhtml (login.xhtml):
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<div style="width:100%;font-size:12px;line-height:20px;background-color:#b0d9e6;color:white">
<h:form>
<h:message id="top_msg"></h:message>
<h:panelGrid width="100%" columns="3" columnClasses="none,right1,right1">
<h:outputLink rendered="#{!loginController.loggedIn}" styleClass="text-align:right;" value="javascript:void(0)" onclick="PF('dlg').show();" title="login">
<p:outputLabel>Login</p:outputLabel>
</h:outputLink>
<h:commandLink rendered="#{loginController.loggedIn}" action="#{loginController.logout}" styleClass="text-align:right;" >
<h:outputLabel>Logout</h:outputLabel>
</h:commandLink>
<p:growl id="growl" sticky="true" showDetail="true" life="3000" />
<p:dialog header="Login" widgetVar="dlg" resizable="false">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel for="username" value="Username:" />
<p:inputText id="username" value="#{loginController.username}" required="true" label="username" />
<h:outputLabel for="password" value="Password:" />
<p:password id="password" value="#{loginController.password}" required="true" label="password" />
<f:facet name="footer">
<p:commandButton value="Login"
update="@form :createform:createbutton"
actionListener="#{loginController.login}"
oncomplete="handleLoginRequest(xhr, status, args)" >
</p:commandButton>
</f:facet>
</h:panelGrid>
</p:dialog>
</h:panelGrid>
<script type="text/javascript">
function handleLoginRequest(xhr, status, args)
</script>
</h:form>
</div>
</ui:composition>
...
这个包含在以下主页中:
...
<ui:include src="login.xhtml" />
<h:form id="createform">
<h:panelGroup id="createbutton" layout="block">
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
</h:panelGroup>
</h:form>
您不能重新渲染未渲染的组件。如果您部分呈现一个按钮,但该按钮未呈现,则无法调用该按钮的更新,因为它不存在于 DOM.
您必须调用父命名容器的 AJAX 更新,它始终呈现。因此,更新 :createform 而不是里面的按钮。表单始终呈现,无论如何。
我发现了问题。在我的 commandButton "createnew" 中,我使用了错误的值进行渲染。
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{recepieController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
它应该使用我的会话作用域 bean (loginController) 来检查用户是否登录。更改为以下工作。
<h:panelGroup id="createbutton">
<p:commandButton id="createnew"
ajax="false"
action="#{recepieController.createNewRecipes}"
value="Create new recipe"
rendered="#{loginController.loggedIn and !recepieController.create and !recepieController.viewOnly and !recepieController.edit}"
accesskey="s">
</p:commandButton>
</h:panelGroup>
注意区别 rendered="#{loginController.login ...} 而不是 rendered="#{recepieController.loggedIn}"
recepieController 也有一个我设置的 loggedIn 属性,但由于页面没有重新发布,我猜我登录时该属性的值没有改变。 但是,我相信我测试过在 p:commandButton 中使用 ajax="false" 作为登录对话框,我想这应该重置我的 loggedIn 属性的视图范围版本。我不完全明白为什么那行不通。