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

时间:2015-10-24 09:42:36

标签: java file gwt input client

我在GWT中创建一个仅客户端应用程序,使用WebGL将后期处理效果应用于图像。我已将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

我做错了吗?

1 个答案:

答案 0 :(得分:1)

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

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

因为$entry在传入函数上调用apply,并且updateImage可能有void返回类型(这意味着JS中的函数将隐式返回{ {1}}),您收到undefined错误。

解决方案是向Cannot read property 'apply' of undefined传递一个将调用$entry的函数:

updateImage

话虽如此,您有没有理由不使用$entry(function() { object.@com.shc.cartoonizer.client.Main::updateImage(*)(element); }) 小部件和FileUpload