@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的最佳做法是什么?
答案 0 :(得分:1)
重要的是,您只需拨打addChangeHandler()
一次。如果你多次调用它(如在你的场景中),你最终会在值发生变化时同时调用多个处理程序(因此重复的值会被打印)。
如果在添加实际项目之前或之后调用addChangeHandler()
,这并不重要。我通常在创建ListBox实例后立即添加更改处理程序,这就是我经常看到的。
由于您使用的是UIBinder,因此会自动为您创建ListBox实例。在这种情况下,调用addChangeHandler()
的好地方将在UI容器的构造函数中。使用MVP时,它可能应该使用演示者的绑定方法。