【问题标题】:valueChangeListener calls for every datatable column instead of only changed columnvalueChangeListener 调用每个数据表列,而不仅仅是更改的列
【发布时间】:2016-11-21 03:26:50
【问题描述】:

我正在学习 JSF,并且对 valueChangeListener 的工作方式有一个理解问题。我正在尝试在数据表中使用它。在这里使用 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。例如,如果我只更改标题,它也会调用名字 valueChangeListener。 @BaluC 在此链接上提供的答案说只有在值更改时才应该调用它。 [When to use valueChangeListener or f:ajax listener?

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

【问题讨论】:

    标签: jsf primefaces datatable valuechangelistener


    【解决方案1】:

    valueChangeListener 将在值更改并提交表单时调用。

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

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

    希望有帮助!

    【讨论】:

    • 感谢您的回答。正如我在问题中所问的那样,它没有按预期的方式工作。即使列值未更改,它也会调用所有其他 valueChangeListener。我不能使用编辑 dataTable 功能,因为我还需要旧值进行审计。
    • 所以监听器方法被调用为数据表中的每条记录,独立于指定的值是否改变了?您可以通过 CellEditEvent 接收旧值和新值这两个值。我很确定你可以通过 RowEditEvent 做同样的事情。
    • 所以监听器方法被调用为数据表中的每条记录,独立于指定的值是否改变了? - 是的,它被每条记录调用。我必须详细了解 CellEditEvent 和 RowEditEvent。但仅从知识角度来看,我想了解我在实现 valueChangeListener 时面临的问题的根本原因。在这里,每条记录在我的案例列中表示“标题”和“名字”,所以我正在更改标题的值并提交表单。它同时调用 titleChangeListener 和 firstNameChangeListener。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多