Метод вызывается дважды GWT - PullRequest
3 голосов
/ 19 февраля 2011

Я создаю веб-приложение с GWT.У меня есть метод bookMode (), который создает пользовательский интерфейс с некоторыми текстовыми полями, списками и т. Д. И показывает его в диалоговом окне.Я называю метод следующим образом:

//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 ]

5 голосов
/ 21 февраля 2011

Когда код Java конвертируется в HTML и Javascript; Сравнение равенства между Java и Javascript не то же самое. Следовательно, если у вас есть два виджета (кнопки) с одинаковым идентификатором в HTML и вы добавляете обработчики кликов к каждому по одному, велика вероятность, что один и тот же виджет получит обработчик кликов дважды. Попробуйте установить разные идентификаторы для виджетов кнопок, что помогло мне решить любые проблемы, связанные с вызовами обработчиков нескольких кликов.

0 голосов
/ 19 января 2012

Вот как я это решил: я объявил переменную регистрации обработчика, как это

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 (), protectDefault () и удаляете обработчик, чтобы быть уверенным, что он не срабатывает более одного раза

0 голосов
/ 15 декабря 2011

У меня была похожая проблема с кнопками GWT.

Я создавал Button внутри класса под названием "Widgets.java", не записывая слушателя в этот класс. Затем я использовал эту кнопку как «ClassName.ButtonName», как макрос: «Widgets.myButton».

Конечно, в определенный момент я добавил слушателя к этой кнопке, на которую ссылаются, из другого класса, и хотя я удалял и чистил полную RootPanel, когда мне пришлось заново перерисовать кнопку с тем же именем, и поэтому казалось, что кнопка KEPT слушателя уже ассоциируется и снова добавляется A NEW ONE.

Таким образом, каждый раз, когда я нажимал эту кнопку, связанная с ней функция запускалась дважды.

Решение? Просто прекратите использовать «ссылку» на кнопку и создайте ее локально.

Я читал эту ветку, и это "просветило" меня, чтобы найти решение, просто хотел заработать два цента. :)

0 голосов
/ 01 декабря 2011

Существует два способа решения этой проблемы:

1) поставить после объекта, который запускается дважды, эти два метода

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

или просто замените Event на 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), а затем найдите метод

0 голосов
/ 03 мая 2011

Я предполагаю, что вы как-то добавляете ClickHandler дважды.

Я бы сделал что-то подобное для отладки:

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

Если вы видите «добавление обработчика кликов!» напечатайте дважды, это ваш ответ.

Я столкнулся с подобной проблемой некоторое время назад при реализации шаблона MVP. Представление было статичным и инициализировалось только один раз, однако ведущий инициализировался при каждом запросе места. Каждый раз, когда Presenter инициализировался, он связывал событие click, в свою очередь добавляя ClickHandler несколько раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...