如何将可能未定义的全局对象与 JsInterop 一起使用



我的第三方应用程序的主机页面可能具有全局对象window.PageObject。如果存在,我的应用需要使用其属性和函数(如果存在(。我已经提出了一个使用 JsInterop 的解决方案,但它需要每个属性/函数的多个方法声明:

@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 中所做的那样(。

现在,如果您真的想要一些在未定义对象时无操作/返回 null 的静态 API,那么您没有太多选择,无论如何都需要编写一个包装器(就像您在 JS 中所做的那样(

检查窗口的预感。页面对象 您可以执行以下操作:

  1. 为 JavaScript 变量 'window' 创建一个 JsInterop 包装器

    @JsType(isNative=true, namespace=JsPackage.GLOBAL, name="window")
    public class JsWindowWrapper {
        public static Object PageObject;
    }
    
  2. 检查是否窗口。页面对象已定义

    if (null != JsWindowWrapper.PageObject) { ... };
    

最新更新