方法称为两次GWT

时间:2011-02-19 19:17:29

标签: java javascript gwt methods

我正在使用GWT创建一个Web应用程序。我有一个方法bookMode(),它使用一些文本框,列表框等构建一个UI,并在对话框中显示它。我把这个方法称为:

//listen for mouse events on the add button
    addButton.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {

            String check = Cookies.getCookie("role");
            if(check == "TopBeheerder") {   
                boolean currentMode = mode0.getValue();
                add addObject = new add();
                if(currentMode == true) {
                    addObject.bookMode();
                }
                if(currentMode == false) {
                    addObject.userMode();
                }   
            }
            else {
                BibPhp.notification("You don't have enough permissions.");
            }


        }
    });

当我使用GWT.log()函数时,我注意到这个方法被调用了两次。但我使用eclipse搜索功能搜索了所有代码,并且该方法未被调用两次。我不知道为什么GWT表现得像这样。 userMode()方法也被调用两次。

5 个答案:

答案 0 :(得分:5)

当Java代码转换为HTML和Javascript时; java和javascript之间的相等比较是不一样的。因此,如果您在HTML中有两个具有相同ID的小部件(按钮)并逐个添加单击处理程序,则相同的小部件可能会将单击处理程序添加两次。尝试为按钮小部件设置不同的ID,这有助于我解决与多个单击处理程序调用相关的任何问题。

答案 1 :(得分:0)

我的猜测是,不知何故,你要两次添加ClickHandler。

我会做这样的事情来调试:

System.out.println("adding click handler!");
addButton.addClickHandler(new ClickHandler() { ...

如果您看到“添加点击处理程序!”打印两次,这是你的答案。

在实施MVP模式的过程中,我遇到了类似的问题。视图是静态的并且只初始化一次,但是每次请求Place时都会初始化Presenter。每次初始化Presenter时,它都会绑定click事件,然后多次添加ClickHandler。

答案 2 :(得分:0)

有两种方法可以解决此问题:

1)放置两次触发两次方法的对象

Event.stopPropagation();
Event.preventDefault();

或者只使用 arg0 替换事件,如果您使用的是键/鼠标等处理程序。 如果这不停止调用它两次,请使用第二种方式

2)    在类中声明这个变量 - > private RegistrationHandler stopHandler;

然后当你添加click / mouse / keypress处理程序时写下:

    stopHandler=addButton.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {

        String check = Cookies.getCookie("role");
        if(check == "TopBeheerder") {   
            boolean currentMode = mode0.getValue();
            add addObject = new add();
            if(currentMode == true) {
                addObject.bookMode();
            }
            if(currentMode == false) {
                addObject.userMode();
            }   
        }
        else {
            BibPhp.notification("You don't have enough permissions.");
        }

      stopHandler.removeHandler();<-----------------
    }
});

stopHandler.removeHandler()放在哪里,你需要停止重复两次。

p.s:如果找不到removeHandler()方法,请写stopHandler(.dot)然后搜索方法

答案 3 :(得分:0)

我遇到了类似GWT按钮的问题。

我在名为“Widgets.java”的类中创建了一个Button,而没有在该类中编写监听器。然后我使用这个按钮作为“ClassName.ButtonName”,就像一个宏:“Widgets.myButton”。

当然,在某个时刻,我正在为另一个类的引用按钮添加一个监听器,虽然我正在删除并清理完整的RootPanel,但是当我不得不再次重新绘制具有相同名称的按钮时,它似乎听众已经关联的按钮KEPT再次添加了一个新的。

因此,每次单击该按钮时,与其关联的功能都会运行两次。

解决方案?只需停止使用Button的“引用”并在本地创建它。

我读了这个帖子并且“开悟”我达到我的解决方案,只是想赚两分钱。 :)

答案 4 :(得分:0)

以下是我如何解决它: 我声明了一个像这样的处理程序注册变量

private HandlerRegistration HandlerButton;

然后当你需要调用addbutton方法时,使用

之前创建的变量
HandlerButton=addButton.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {

        String check = Cookies.getCookie("role");
        if(check == "TopBeheerder") {   
            boolean currentMode = mode0.getValue();
            add addObject = new add();
            if(currentMode == true) {
                addObject.bookMode();
            }
            if(currentMode == false) {
                addObject.userMode();
            }   
        }
        else {
            BibPhp.notification("You don't have enough permissions.");
        }

      event.stopPropagation();
      event.preventDefault();     
      HandlerButton.removeHandler();
    }
});

在方法结束时,您只需调用stopPropagation(),preventDefault()并删除处理程序,以确保它不会触发多次