如何在ValueChangeEvent中重新加载JSF页面?

6

我有一个selectonemenu,当选择发生变化时,用户应该被导航到相关页面。

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

2个回答

13

你不能绕过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;
}

如果您不想使用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);
}

或者,如果您已经将所需的URL作为f:selectItem值,则可以仅使用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>

4
<h:selectOneMenu onchange="document.getElementById('myform').submit();" ...>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接