在Gwt中编写addChangeHandler的最佳实践是什么?

时间:2013-12-06 02:28:10

标签: gwt

在UiBinder中

@UiField ListBox testListBox;

在演示者中,我有一个方法getData(),可将数据放入testListBox

public void getData(){
        getView().getTestListBox().clear();
        getView().getTestListBox().addItem("itm 1");
        getView().getTestListBox().addItem("itm 2");
        getView().getTestListBox().addItem("itm 3");
        getView().getTestListBox().addChangeHandler(new ChangeHandler(){

            @Override
            public void onChange(ChangeEvent event) {
                // TODO Auto-generated method stub
                int ind=getView().getTestListBox().getSelectedIndex();
                System.out.println(getView().getTestListBox().getValue(ind));
            }

        });
}

现在,我还有一个按钮来呼叫getData()。如果我点击那个按钮1次,那么我在testListBox中选择“itm 1”,一切都很好,因为它会打印出来:

itm 1

然而,如果我第二次点击该按钮,&选择“itm 1”然后打印两次“itm 1”:

itm 1
itm 1

如果我第三次点击它,它将打印三个“itm 1”....

但是如果我在将项目添加到列表框之前将getView().getTestListBox().addChangeHandler放在getData()方法之外(即我在列表框中有实际项目之前执行addChangeHandler),那么一切很好,因为它只打印一次。

那么在Gwt中编写addChangeHandler的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

重要的是,您只需拨打addChangeHandler()一次。如果你多次调用它(如在你的场景中),你最终会在值发生变化时同时调用多个处理程序(因此重复的值会被打印)。

如果在添加实际项目之前或之后调用addChangeHandler(),这并不重要。我通常在创建ListBox实例后立即添加更改处理程序,这就是我经常看到的。

由于您使用的是UIBinder,因此会自动为您创建ListBox实例。在这种情况下,调用addChangeHandler()的好地方将在UI容器的构造函数中。使用MVP时,它可能应该使用演示者的绑定方法。