我在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
我做错了吗?
答案 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
?