【问题标题】:How to pass a GWT method as a parameter into a Javascript function?如何将 GWT 方法作为参数传递给 Javascript 函数?
【发布时间】:2012-07-11 07:49:53
【问题描述】:

概述

  • 有一个GWT方法叫做:private void handleError()
  • 有一个JSNI Javascript函数叫做:private native void registerErrorHandler()
  • 本机 javascript 函数从第三方 Javascript 库调用另一个函数:foo.attachEvent("EventName", handlerReference);

功能

我需要将 GWT 方法作为函数参数传递给foo.attachEvent() 函数,我尝试了几种方法:

foo.attachEvent("Error", registerErrorHandler); -> 类型不匹配异常

foo.attachEvent("Error", this.@package.foo::registerErrorHandler()); -> 类型不匹配异常

var handler = this.@package.foo::registerErrorHandler()();
foo.attachEvent("Error", handler);

-> 类型不匹配异常

纯 Javascript

当我用纯 Javascript 编写此代码时,它正在工作:

function handleError() {
    alert("Error");
}
function registerErrorHandler() {
    var event = "Error";
    var handler = handleError;

    foo.attachEvent (event, handler);
}

如何在 GWT 中实现它?我在完全理解 Javascript - Java Objects 转换时遇到了很多问题。我将handleError 函数引用理解为JavaScriptObject,但我无法使用该信息使其工作。

【问题讨论】:

  • GWT 必须在 RootLayoutPanel 中执行 - 这是一个完整的页面。您不能将 Javascript 与 GWT 生成的函数混合使用。 GWT 的目的不是这个。

标签: java javascript gwt jsni


【解决方案1】:

你的代码需要看起来像这样:(只有一次大括号,因此函数没有被执行......)

var handler = this.@package.foo::registerErrorHandler();
foo.attachEvent("Error", handler);

但您还想做的是将您的函数包装在 $entry 函数中,以便您的未捕获异常处理程序可以工作:

var handler = this.@package.foo::registerErrorHandler();
foo.attachEvent("Error", $entry(handler));

你总能做的是构建一个直接调用你的 gwt 函数的 js 函数:

var that = this;
var handler = function(){
    that.@package.foo::registerErrorHandler()();
};
foo.attachEvent("Error", $entry(handler));

【讨论】:

  • 感谢您的洞察力。您的第一个示例立即生效。但是,第三方库并没有以某种方式附加事件,但是当我在您的第三个示例中定义一个新函数并在那里提供一个具体实现(如$wnd.alert("handled!");)时,它正在工作。如果我使用特殊语法传递一个 GWT 函数,它就不起作用,并且在 gwt 代码 (__gwt_tearOffGenerators) 的某处会引发异常。你也有这个想法吗?
  • 啊,现在我明白var that 的东西了。它正在工作。再次感谢。
猜你喜欢
  • 2019-07-11
  • 2011-08-18
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2019-08-29
  • 2013-01-27
相关资源
最近更新 更多