将ClickHandler与原生Javascript对象一起使用?

用户246114:

在Javascript中,我正在制作SVG形状并向其添加点击处理程序,如下所示:

  var rect = document.createElementNS('http://www.w3.org/2000/svg','rect');
  rect.addEventListener('click', myClickHandler, false);

这很好。我正在尝试在GWT中制作一个Rect类叠加层。如果可能的话,我只想做这样的事情:

public class SVGRect extends JavaScriptObject {

    public native void addClickHandler(ClickHandler handler) /*-{
        addEventListener('click', handler, false);
    }-*/;
}

这样,我可以将“普通” GWT处理程序传递给此类,并从外部将其用作任何其他普通GWT UI元素。我不确定如何将ClickHandler对象连接到该对象的本机javascript实现?

谢谢

伊戈尔·克里默(Igor Klimer):

因为您需要ClickEvent传递给ClickHandler.onClickJavaScript并从JavaScript中获取它,所以会造成问题(AFAICT)-我将采用一种稍微不同的,更“通用”的方法:

创建一个简单的回调接口:

public interface Callback {
    void execute();
}

然后,您可以直接传递它并按如下方式调用它:

public native void addClickHandler(Callback callback) /*-{
        addEventListener('click', function() {
           [email protected]::execute()();
        }, false);
}-*/;

或创建一个中间步骤:

public void addClickHandler(Callback callback) {
    _addClickHandler(getCallback(callback));
}

private native void _addClickHandler(JavaScriptObject callback) /*-{
     addEventListener('click', callback, false);
}-*/;

// This can be moved to a better place
private native static JavaScriptObject getCallback(Callback callback) /*-{
    return function()
    {
        [email protected]::execute()();
    };
}-*/;

而且,当然,您会像这样使用它:

SVGRect svg = getMeSVGRect();
svg.addClickHandler(new Callback() {
    @Override
    public void execute() {
        // Do some stuff
    }
});

就个人而言,我更喜欢第二种解决方案-虽然它包含更多代码,但我希望将本机/ JSNI方法保持私有状态(除非它是一个覆盖对象或类似的东西),并且代码更具可读性且不易出错(无需使用从本地/ JSNI代码内部调用Java函数的时髦语法)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章