【问题标题】:GWT JSNI return a js-functionGWT JSNI 返回一个 js 函数
【发布时间】:2013-02-05 16:20:11
【问题描述】:

如何在 GWT 中从 JSNI 返回一个 JavaScript 函数?我尝试了以下方式:

/* JSNI method returning a js-function */
public static native JavaScriptObject native_getFunction() /*-{
    return function(a,b){
        //do some stuff with a,b
    }
}-*/;

将函数存储在变量中

/* outside from GWT: store the function in a variable */
JavaScriptObject myFunction = native_getFunction();

之后使用该函数会产生以下错误消息:

(TypeError): object is not a function

有人知道如何解决这个问题吗?

【问题讨论】:

  • 你为什么要这么做???
  • 返回的函数是一个 d3.js 转换函数,在其他几个 JSNI 方法中用于转换一些数据。为了避免冗余并动态更改转换,我想将其存储在一个变量中。
  • 我不明白为什么你不能简单地从其他 JSNI 方法调用这个 JS 函数,就像你在文档中调用任何 JS 一样,而不将其存储在变量中。
  • (1) 为什么不直接调用该函数:正如我所说,它是来自 d3.js 的转换函数,但带有我编写的自定义参数。因此,每当我需要任何 JSNI 方法中的转换函数时,我都必须再次编写转换函数(重复代码,可维护性)。 (2) 因此,我只定义了一次函数,将其存储在一个变量中,然后可以将该函数作为参数提供给任何需要转换的 JSNI 方法。
  • 您可以定义您的 JS 函数,将其注入到文档中(使用 GWT ScriptInjector),并直接从任何 JSNI 方法调用它。但我喜欢 Simon-Pierre 的解决方案。

标签: javascript gwt d3.js


【解决方案1】:

这对我有用。声明这些方法:

public static native JavaScriptObject native_getFunction() /*-{
    return function(a,b){
        //do some stuff with a,b
    }
}-*/;

private native void invoke(JavaScriptObject func)/*-{
    func("a", "b");
}-*/;

然后,您可以这样使用这些方法:

JavaScriptObject func = native_getFunction();
invoke(func);

【讨论】:

    【解决方案2】:

    让我们在Homepage.html 中考虑您的appName.nochache.js(GWT)

    homepage.html

    <script>
        function printMyName(name) {
            alert("Hello from JavaScript, " + name);
        }
        </script>
    

    在你的 Gwt 中:

    在你的 Gwt 源码中,你可以通过 JSNI 访问 sayHello() JS 函数:

    native void printMyNameInGwt(String name) /*-{
      $wnd.printMyName(name); // $wnd is a JSNI synonym for 'window'
    }-*/;
    

    您也可以将它们分配给变量

    native void printMyNameInGwt(String name) /*-{
      var myname =$wnd.printMyName(name); // return that for your purposes
    }-*/;
    

    注意:如果您正在调用任何外部文件的 js 方法,该文件应该使用 &lt;script&gt; 标签附加到您的 html 页面上...

    【讨论】:

    • 我认为将相关方法提取到html页面也是一个不错的解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多