简体   繁体   English

在动态创建的selecOneMenu内容上未触发PrimeFaces p:ajax event =“ change”

[英]PrimeFaces p:ajax event=“change” not fired on dynamically created selecOneMenu content

I want to generate selecOneMenu content when the user types in an inputText field, and respond to combo box selection changes. 我想在用户在inputText字段中键入内容时生成selecOneMenu内容,并响应组合框选择的更改。
The below code updates the contents of the selecOneMenu as the user types. 以下代码在用户键入时更新selecOneMenu的内容。 (The typed and the next 9 numbers gets added to the combo box. This is just a simplified example code.) (将键入的数字和接下来的9个数字添加到组合框中。这只是一个简化的示例代码。)
When the page is loaded, the change event of the selecOneMenu correctly gets fired. 加载页面后,将正确触发selecOneMenu的change事件。 However after typing in the inputValue field, content of selecOneMenu is changed, and the change event is not fired when I select an item. 但是,在inputValue字段中键入后,selecOneMenu的内容将更改,并且在选择项目时不会触发change事件。

The code works if ComboBean is session scoped, but I want to avoid this solution if possible. 如果ComboBean是会话作用域的,则该代码有效,但我希望尽可能避免这种解决方案。

Is it possible at all to do this? 有可能做到这一点吗?
What is the reason if it is not possible with request scope? 请求范围无法实现的原因是什么?

PrimeFaces 2.2 PrimeFaces 2.2
Mojarra 2.0.2 Mojarra 2.0.2
GlassFish 3.0.1 GlassFish 3.0.1
Browser: Chrome, Firefox, IE 浏览器:Chrome,Firefox,IE

combo.xhtml: combo.xhtml:

<h:head>
    <title>Combo box example</title>
</h:head>

<h:body>
    <h:form>
        <p:panel id="mainPanel">
            <h:panelGroup id="formToSubmit" layout="block">
                <p:messages id="messages" />
                <h:panelGrid columns="2">
                    <h:outputLabel value="Enter a number" />
                    <h:inputText id="inputValue" value="#{comboBean.inputValue}">
                        <p:ajax event="keyup" update="combo"
                            listener="#{comboBean.onKeyUp}" />
                    </h:inputText>

                    <h:outputLabel value="Select a value:" />
                    <h:selectOneMenu id="combo" value="#{comboBean.selectedValue}">
                        <f:selectItem itemLabel="Select a value..."
                            noSelectionOption="true" />
                        <f:selectItems value="#{comboBean.values}" />
                        <p:ajax event="change" update="selectedValue"
                            listener="#{comboBean.valueSelected}" />
                    </h:selectOneMenu>
                    <h:outputLabel value="Selected value:" />
                    <h:inputText id="selectedValue" value="#{comboBean.selectedValue}" />
                </h:panelGrid>
            </h:panelGroup>
        </p:panel>
    </h:form>
</h:body>
</html>

ComboBean.java ComboBean.java

package x;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class ComboBean implements Serializable
{
    private static final long serialVersionUID = 1L;
    private String inputValue;
    private String selectedValue;
    private List<String> values;

    @PostConstruct
    void init()
    {
        System.out.println("init");
        setValues(new LinkedList<String>());
        for(int i = 0; i<10 ; i++)
        {
            getValues().add(""+i);
        }
    }

    public void onKeyUp()
    {
        System.out.println("onkeyUp " + getInputValue());
        setValues(new LinkedList<String>());
        if (inputValue != null)
        {
            try 
            {
                int v = Integer.parseInt(inputValue);
                for(int i = 0; i<10 ; i++)
                {
                    getValues().add(""+(v+i));
                }
            } 
            catch (NumberFormatException ne) 
            {
                //doesn't matter
            }
        }
    }

    public void valueSelected()
    {
        System.out.println("valueSelected " + getSelectedValue());
    }

    public void submit()
    {
        System.out.println("submit " + getInputValue());
    }

    public void setInputValue(String inputValue)
    {
        this.inputValue = inputValue;
    }

    public String getInputValue()
    {
        return inputValue;
    }

    public void setSelectedValue(String selectedValue)
    {
        this.selectedValue = selectedValue;
    }

    public String getSelectedValue()
    {
        return selectedValue;
    }

    public void setValues(List<String> values)
    {
        this.values = values;
    }

    public List<String> getValues()
    {
        return values;
    }

}

The problem is that you reset your list during each request in the init() method. 问题是您在init()方法中的每个请求期间重置了列表。 So your selected element will no longer be there. 因此,您选择的元素将不再存在。

If you don't want to use SessionScope , maybe the ViewScope would be a solution: then the bean won't be reset if the same page is reloaded. 如果您不想使用SessionScope ,也许可以使用ViewScope解决方案:如果重新加载同一页面,则不会重置Bean。

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

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