更改 GWT 客户端的文件输入元素

File Input Element on change GWT client side

我正在使用 WebGL 将 post 处理效果应用于图像的 GWT 中制作客户端专用应用程序。我在这样的类型文件的文档中添加了一个InputElement

InputElement inputElement = InputElement.as(Document.get().createFileInputElement());
inputElement.setAccept("image/*");
Document.get().getBody().appendChild(inputElement);

然后我想给它添加一个 onchange 侦听器,因为 GWT 不支持它,所以我写了这个 JSNI 方法来做到这一点。

private native void registerOnChange(Main object, InputElement element) /*-{
    if (!$wnd.update)
        $wnd.update = $entry(object.@com.shc.cartoonizer.client.Main::updateImage(*)(element));

    element.onchange = $wnd.update;
}-*/;

问题是,这会在文件更改时引发 JS TypeError。这是在控制台中抛出的错误。

Uncaught TypeError: Cannot read property 'apply' of undefined
    apply_0_g$           @ Impl.java:247
    entry0_0_g$          @ Impl.java:306
    (anonymous function) @ Impl.java:72

我做错了什么吗?

$entry(object.@com.shc.cartoonizer.client.Main::updateImage(*)(element))

$entry 将一个函数作为输入,return 是一个函数,但是您传递了 updateImage 函数的结果。

因为 $entry 在传入的函数上调用 apply,而你的 updateImage 可能有一个 void return 类型(这意味着函数在 JS 中会隐式 return undefined),你会得到一个 Cannot read property 'apply' of undefined 错误。

解决方案是向 $entry 传递一个将调用 updateImage:

的函数
$entry(function() {
  object.@com.shc.cartoonizer.client.Main::updateImage(*)(element);
})

话虽如此,您有什么理由不使用 FileUpload 小部件和 addChangeHandler