GWT JSNI вызывает метод экземпляра Java из вложенной функции Javascript

У меня есть простая оболочка для редактора WYSIWYG (TinyMCE). Я использую JSNI для вызова метода экземпляра Java (onClick) из Javascript. Однако метод Java onClick всегда вызывается для одного и того же экземпляра Java (последнего созданного), независимо от того, в каком редакторе он был создан.

        private SimplePanel panel;
        private TextArea ta;
        private String id;

        public TinyMCE(AbstractTinyMCEConfiguration config) {       
            id = HTMLPanel.createUniqueId();
            ta = new TextArea();
            ta.getElement().setId(id);
                panel = new SimplePanel();
            panel.add(ta);
            initWidget(panel);
            init(config);
        }

        protected native void init(AbstractTinyMCEConfiguration conf) /*-{
            var ins = this;
            $wnd.tinyMCE.init({
                    // General options
                    mode : [email protected]::getMode()(),
                    setup : function(ed) {
                        ed.onClick.add(function(ed,e) { 
                            alert(ed.id);
                            [email protected]::onClick(Lcom/google/gwt/dom/client/NativeEvent;)(e);
                        }); 
                    }
                }); 
        }-*/;

        private void onClick(NativeEvent e) {
            GWT.log("onClick " + id);
            ClickEvent.fireNativeEvent(e, this);
        }

Я не уверен, смогу ли я вызвать метод Java из функции Javascript, которая находится внутри другой функции. Может быть, это объясняет мою проблему... или, может быть, я что-то упускаю. Спасибо за вашу помощь.


person Javier Ferrero    schedule 15.10.2012    source источник
comment
Вы говорите GWT.log(onClick + id); Откуда берется id?   -  person Andrei Volgin    schedule 16.10.2012
comment
Идентификатор устанавливается в конструкторе, другой идентификатор для каждого экземпляра TinyMCE.   -  person Javier Ferrero    schedule 16.10.2012
comment
Я думаю, что каждый вызов инициализации перезаписывает предыдущую настройку - есть только один $wnd.tinyMCE. Что такое эд? Возможно, вы можете использовать ed, чтобы выяснить, какому экземпляру принадлежит клик?   -  person Stefan Haustein    schedule 16.10.2012
comment
Это похоже на проблему с TinyMCE. При чем здесь «режим»? Это может привести к тому, что другие редакторы будут перезаписаны. Кроме того, похоже, что эта текстовая область не будет инициализирована, поскольку она не привязана к dom при запуске функции инициализации. Пример: fiddle.tinymce.com/5ncaab   -  person Danny Kirchmeier    schedule 16.10.2012
comment
@Stefan Я проверил, что редакторы (ed) созданы правильно. Редакторы создаются с использованием идентификатора из текстовой области. Как вы предложили, если я нажму на разные редакторы, я увижу, что их идентификатор отличается (см. предупреждение в коде), но тогда метод Java всегда регистрирует один и тот же идентификатор   -  person Javier Ferrero    schedule 16.10.2012
comment
@ Дэнни, я пропустил часть кода для простоты. Я добавил недостающие строки в конструкторе. Текстовая область добавляется на панель и прикрепляется к DOM.   -  person Javier Ferrero    schedule 16.10.2012


Ответы (1)


Я думаю, что TinyMCE имеет одну общую конфигурацию для всех редакторов, и в этом проблема.

Вероятно, нет особого смысла передавать конфигурацию конструктору, если она является общей...

Почему бы не добавить статическую карту, которая сопоставляет идентификатор обратно с экземпляром Java, что-то вроде

    // ....
    private static Map<String, TinyMCE> idMap = new HashMap<String, TinyMCE>();

    public TinyMCE() {       
        // ...
        idMap.put(id, this);
    }

    // call this from Javascript with (ed.id, e)
    private static void onClick(String id, NativeEvent e) {
      idMap.get(id).onClick(e);
    }
person Stefan Haustein    schedule 15.10.2012
comment
Вы были правы, TinyMCE использует единую конфигурацию для всех редакторов. Проблема не имела ничего общего с GWT. Ваш статический подход - это то, что мне было нужно. Большое спасибо - person Javier Ferrero; 16.10.2012