如何从 ValueChangeEvent 重新加载 JSF 页面?

2023-11-23

我有一个选择菜单,其中选择的更改应将用户导航到相关页面。

那么,如何使用 selectonemenu 控件模拟命令按钮的操作处理(或者是否有更优雅的方法来实现此目的)?


为此你不能绕过 Javascript。基本上你需要让 Javascript 将请求提交到服务器端。在 HTML 中<select>元素(由 JSF 生成h:selectOneMenu)你最好使用onchange属性为此。每当用户更改元素的值时,您附加到此事件的任何 JS 都会被调用。

<h:selectOneMenu onchange="this.form.submit();">

或者如果你懒得写,这个简写也是正确的:

<h:selectOneMenu onchange="submit()">

这将结合第一个下一个 HTML 提交表单input type="submit"同一表单内的元素(由 JSF 生成)h:commandButton).

<h:form>
    <h:selectOneMenu value="#{bean.page}" onchange="submit()" required="true">
        <f:selectItem itemLabel="Select page.." />
        <f:selectItems value="#{bean.pages}" />
    </h:selectOneMenu>
    <h:commandButton value="submit" action="#{bean.submit}" />
    <h:commandButton value="other" action="#{bean.other}" /> <!-- won't be submitted -->
</h:form>

您需要在操作方法中编写逻辑,该逻辑会导致导航操作,如定义的那样faces-config.xml进行。例子:

public String submit() {
    return this.page;
}

如果你这样做not想要使用commandButton,那么你也可以继续滥用valueChangeListener:

<h:form>
    <h:selectOneMenu value="#{bean.page}" onchange="submit()"
        valueChangeListener="#{bean.change}" required="true">
        <f:selectItem itemLabel="Select page.." />
        <f:selectItems value="#{bean.pages}" />
    </h:selectOneMenu>
</h:form>

在 bean 中,您将拥有:

public void change(ValueChangeEvent event) {
    String page = (String) event.getNewValue(); // Must however be the exact page URL. E.g. "contact.jsf".
    FacesContext.getCurrentInstance().getExternalContext().redirect(page);
}

或者,如果您已经拥有所需的 URLf:selectItemvalue,那么你也可以只使用 JS 而没有 bean 操作:

<h:selectOneMenu value="#{bean.page}"
    onchange="window.location = this.options[this.selectedIndex].value">
    <f:selectItem itemLabel="Select page.." />
    <f:selectItem itemLabel="home" itemValue="home.jsf" />
    <f:selectItem itemLabel="faq" itemValue="faq.jsf" />
    <f:selectItem itemLabel="contact" itemValue="contact.jsf" />
</h:selectOneMenu>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 ValueChangeEvent 重新加载 JSF 页面? 的相关文章