如何将可能未定义的全局对象与 JsInterop 一起使用?
How do I use a possibly undefined global object with JsInterop?
我的第 3 方应用程序的主机页面可能有一个全局对象 window.PageObject
。如果它存在,我的应用程序也需要使用它的属性和函数,如果存在的话。我想出了一个使用 JsInterop 的解决方案,但它需要每个 property/function:
的多个方法声明
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="PageObject")
public class PageObject {
private PageObject PageObject() {}
// called by every single public method
@JsProperty(namespace=JsPackage.GLOBAL, name="PageObject")
private static native boolean __isDefined();
// each property has a native accessor
@JsProperty(name="some_property")
private static native String _getSomeProperty();
// each property also has an overlay method that checks __isDefined()
@JsOverlay
public static String getSomeProperty() {
return __isDefined() ? _getSomeProperty() : null;
}
// calling a function safely requires an additional check to see if it exists
@JsProperty(name="some_procedure")
private static boolean _hasSomeProcedure();
@JsMethod(name="some_procedure")
private static native void _someProcedure();
@JsOverlay
public static void someProcedure() {
if (__isDefined() && _hasSomeProcedure()) {
_someProcedure();
}
}
}
我是否遗漏了 JsInterop 中可以更好地处理此问题的某些部分?是否有其他更易于使用的解决方案(不包括 JSNI)?
使用 PageObject 的实例怎么样?
制作一个静态 getter 来检索实例,然后您可以在调用方法之前检查是否为 null(就像您在 JS 中所做的那样)。
现在如果你真的想要一些静态的 API 是无操作的 / return null 当对象未定义时,那么你没有太多选择,需要编写一个包装器无论如何(就像你在 JS 中所做的那样)
要检查 window.PageObject 的存在,您可以执行以下操作:
为 JavaScript 变量创建一个 JsInterop 包装器 'window'
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="window")
public class JsWindowWrapper {
public static Object PageObject;
}
检查是否定义了window.PageObject
if (null != JsWindowWrapper.PageObject) { ... };
我的第 3 方应用程序的主机页面可能有一个全局对象 window.PageObject
。如果它存在,我的应用程序也需要使用它的属性和函数,如果存在的话。我想出了一个使用 JsInterop 的解决方案,但它需要每个 property/function:
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="PageObject")
public class PageObject {
private PageObject PageObject() {}
// called by every single public method
@JsProperty(namespace=JsPackage.GLOBAL, name="PageObject")
private static native boolean __isDefined();
// each property has a native accessor
@JsProperty(name="some_property")
private static native String _getSomeProperty();
// each property also has an overlay method that checks __isDefined()
@JsOverlay
public static String getSomeProperty() {
return __isDefined() ? _getSomeProperty() : null;
}
// calling a function safely requires an additional check to see if it exists
@JsProperty(name="some_procedure")
private static boolean _hasSomeProcedure();
@JsMethod(name="some_procedure")
private static native void _someProcedure();
@JsOverlay
public static void someProcedure() {
if (__isDefined() && _hasSomeProcedure()) {
_someProcedure();
}
}
}
我是否遗漏了 JsInterop 中可以更好地处理此问题的某些部分?是否有其他更易于使用的解决方案(不包括 JSNI)?
使用 PageObject 的实例怎么样?
制作一个静态 getter 来检索实例,然后您可以在调用方法之前检查是否为 null(就像您在 JS 中所做的那样)。
现在如果你真的想要一些静态的 API 是无操作的 / return null 当对象未定义时,那么你没有太多选择,需要编写一个包装器无论如何(就像你在 JS 中所做的那样)
要检查 window.PageObject 的存在,您可以执行以下操作:
为 JavaScript 变量创建一个 JsInterop 包装器 'window'
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="window") public class JsWindowWrapper { public static Object PageObject; }
检查是否定义了window.PageObject
if (null != JsWindowWrapper.PageObject) { ... };