【问题标题】:GWT JSNI call Java instance method from nested Javascript funcionGWT JSNI 从嵌套的 Javascript 函数调用 Java 实例方法
【发布时间】:2012-10-15 21:40:31
【问题描述】:

我有一个简单的 WYSIWYG 编辑器 (TinyMCE) 包装器。我正在使用 JSNI 从 Javascript 调用 Java 实例方法 (onClick)。然而,无论创建它的编辑器如何,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 : conf.@com.chip.tinymce.client.AbstractTinyMCEConfiguration::getMode()(),
                    setup : function(ed) {
                        ed.onClick.add(function(ed,e) { 
                            alert(ed.id);
                            ins.@com.chip.tinymce.client.TinyMCE::onClick(Lcom/google/gwt/dom/client/NativeEvent;)(e);
                        }); 
                    }
                }); 
        }-*/;

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

我不确定是否可以从另一个函数内的 Javascript 函数调用 Java 方法。也许这解释了我的问题......或者我错过了一些东西。感谢您的帮助。

【问题讨论】:

  • 你说 GWT.log("onClick" + id); id 来自哪里?
  • Id 在构造函数中设置,每个 TinyMCE 实例的 id 不同
  • 我认为每个初始化调用都会覆盖之前的设置——只有一个 $wnd.tinyMCE。什么是ed?也许您可以使用 ed 来确定点击属于哪个实例?
  • 这看起来像是 TinyMCE 的问题。这里的“模式”是什么?它可能会导致其他编辑器被覆盖。此外,该文本区域似乎不会被初始化,因为在 init 函数运行时它没有附加到 dom。示例:fiddle.tinymce.com/5ncaab
  • @Stefan 我已经检查了编辑器(ed)的创建是否正确。编辑器是使用文本区域中的 id 创建的。正如您所建议的,如果我单击不同的编辑器,我可以看到它们的 id 不同(请参阅代码中的警报)但是 Java 方法总是记录相同的 id

标签: gwt tinymce jsni


【解决方案1】:

我认为 TinyMCE 为所有编辑器提供了一个共享配置,这就是问题所在。

如果是共享的,将配置交给构造函数可能没有多大意义......

为什么不添加一个将 id 映射回 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);
    }

【讨论】:

  • 你是对的,TinyMCE 对所有编辑器使用单一配置。该问题与 GWT 无关。你的静态方法是我需要的。非常感谢
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多