2017-05-17 8 views
0

サードパーティのアプリケーションのホストページには、グローバルオブジェクトwindow.PageObjectが含まれている可能性があります。それが存在する場合、私のアプリはそのプロパティと機能を使用する必要があります。私はJsInteropを用いて溶液を作ってみたが、それはプロパティ/機能ごとに複数のメソッド宣言が必要です。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を除く、使いやすいソリューションがありますか?

答えて

1

PageObjectのインスタンスを使用することはどうですか?

インスタンスを取得するために静的ゲッターを作成し、メソッドを呼び出す前にnullをチェックすることができます(JSの場合のように)。

オブジェクトが定義されていないときにno-op/nullを返す静的APIが本当に必要な場合は、あまり選択肢がなく、とにかくラッパーを記述する必要があります(JS )

関連する問題