我有一个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方法。也许这解释了我的问题......或许我错过了一些东西。谢谢你的帮助。
答案 0 :(得分:3)
我认为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);
}