gwt - GWT JsInterop - 在 JavaScript 中扩展 Java 接口
问题描述
因此,我们正在尝试使用 JsInterop,以便在我们的 GWT 应用程序中,我们可以使用在 JavaScript 中外部创建的一些模块。
我们有一个接口,它有一些契约,一些方法必须由所有视图实现。
例如:
package com.foo;
import jsinterop.annotations.JsPackage;
import jsinterop.annotations.JsType;
@JsType(namespace = JsPackage.GLOBAL)
public interface MyView {
void doSomething();
void doSomethingElse();
Element getElement();
}
现在想象一下,在 JS 端,我们有那个接口的实现:
export class MyViewImplementation extends window.$wnd.MyView {
constructor() {
super();
}
doSometing() {
//Implementation goes here
}
doSomethingElse() {
//Implementation goes here
}
getElement() {
var div = document.createElement("div");
div.textContent = "External Component Test";
return div;
}
}
这能行吗?目前,我有一个错误说:Class extends value undefined is not a constructor or null
解决方案
根据您对我的评论的反馈,我@JsType
将从您的界面中删除并引入一个@JsType(isNative=true)
实现该界面的类。
public interface MyView {
void doSomething();
void doSomethingElse();
Element getElement();
}
public class JavaView implements MyView {
// . . .
}
@JsType(isNative = true, namespace = JsPackage.GLOBAL)
public class JsView implements MyView {
@Override
public native void doSomething();
@Override
public native void doSomethingElse();
@Override
public native Element getElement();
}
然后在 JavaScript 中:
export class JsView {
// . . .
}
推荐阅读
- python - 如何在具有不同会话的 selenium 中打开 chrome 中的多个选项卡
- firebase - 我们可以在应用程序处于审查模式时更改应用程序中的实时数据库吗?
- laravel - 试图在 laravel 中获取 Redis 键的值
- c# - 在 .net 核心应用程序中删除部分内存缓存值
- android - 如何为蓝牙广播实现自定义 UUID
- xamarin.forms - Xamarin Forms:视图模型中出现显示错误
- phpspreadsheet - 使用 Phpspreadsheet 将 Xlxs 文件转换为 Csv
- xml - Js2XML 在转换为 XML 时返回了额外的“item”标签
- typescript - 如何使用数字/布尔对键入 JSON 对象
- sql - 如何在 DB2 中获取字符分隔的子字符串?