valueChangeListener调用每个数据表列而不是仅更改列

时间:2016-07-18 13:34:01

标签: jsf primefaces datatable valuechangelistener

我正在学习JSF并且以valueChangeListener的工作方式理解问题。我试图在dataTable中使用它。这里使用valueChangeListener的目的是 - 我想跟踪用户在Title和First Name列中执行的更改。

请在下面找到代码:

<p:dataTable var="tempVar"
                        value="#{tempView.tempVO}">
                        <p:column>
                            <h:outputLabel value="Academic Title:" />
                            <p:inputText value="#{tempVar.title}"
                                style="margin-left:10px;margin-top:20px;width:140px;height:25px"
                                valueChangeListener="#{tempView.titleChangeListener}">
                                <f:attribute name="TITLE" value="TITLE" />
                            </p:inputText>

                            <br />


                            <h:outputLabel value="First Name:" />
                            <p:inputText value="#{tempVar.firstName}"
                                style="margin-left:35px;margin-top:20px;width:140px;height:25px"
                                valueChangeListener="#{tempView.firstNameChangeListener}">
                                <f:attribute name="FIRST_NAME"
                                    value="FIRST_NAME" />
                            </p:inputText>
                 <p:column>
    </p:dataTable>

Bean代码

@PostConstruct
    public void init() {

        try {
            tempVO = tempService
                    .fetchDataFromDatabase(tmpDataBean
                            .tempId());

            System.out.println("success");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public void titleChangeListener(ValueChangeEvent event) {

        String title = (String) ((UIInput) event.getSource()).getAttributes()
                .get("TITLE");

        System.out.println(title);

    }

    public void firstNameChangeListener(ValueChangeEvent event) {

        String firstName = (String) ((UIInput) event.getSource())
                .getAttributes().get("FIRST_NAME");
        System.out.println(firstName);
    }

我面临的问题是 - 为所有数据库列调用valueChangeListener。例如,如果我只更改Title,它也会调用名字valueChangeListener。 @BaluC在此链接上提供的答案表明只有在值更改时才应调用它。 [When to use valueChangeListener or f:ajax listener?

[1]:When to use valueChangeListener or f:ajax listener?有人可以帮助理解valueChangeListener的工作方式,我是以错误的方式使用它吗?谢谢。

2 个答案:

答案 0 :(得分:0)

当值已更改且表单提交时,将调用valueChangeListener

是否要在数据表中分别编辑指定的记录多行?为什么要自己而不是使用Primefaces编辑模式?

http://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml

希望有所帮助!

答案 1 :(得分:0)

终于能够解决问题了。 valueChangeListener按照预期的方式工作,问题在于列表中的数据。如果某些列的数据为null,并且如果提交表单,则null会在内部转换为空字符串,而valueChangeListener会将其视为更改,因此调用方法。