2017-05-17 2 views
0

Die Host-Seite für meine Drittanbieter-App kann ein globales Objekt window.PageObject haben. Wenn es vorhanden ist, muss meine App ihre Eigenschaften und Funktionen verwenden, auch wenn sie vorhanden sind. Ich habe mit einer Lösung mit JsInterop kommen, aber es erfordert mehrere Verfahren Erklärungen pro Objekt/Funktion:Wie verwende ich ein möglicherweise undefiniertes globales Objekt mit 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(); 
     } 
    } 

} 

Bin ich einen Teil JsInterop fehlt, die diese besser behandelt? Gibt es eine andere Lösung, die einfacher zu verwenden ist (außer JSNI)?

Antwort

1

Wie wäre es mit einer Instanz von PageObject?

Stellen Sie ein statisches Getter her, um die Instanz abzurufen, und Sie können vor dem Aufruf von Methoden auf Null prüfen (wie in JS).

Jetzt, wenn Sie wirklich eine statische API wollen, die no-op/null zurückgeben, wenn das Objekt nicht definiert ist, dann haben Sie nicht viel Auswahl und müssen sowieso einen Wrapper schreiben (wie Sie in JS tun würden))

Verwandte Themen