2017-05-26 7 views
1

GWTアプリでインクリメンタルDOMライブラリを使いたいと思います。@JsInteropを使ってGWTアプリでインクリメンタルDOMライブラリのJSパッチ関数を公開する方法

https://google.github.io/incremental-dom/#about

私はJavaの世界から来ていますように、私は、JavaScriptの名前空間とモジュールの概念に苦労しています。私はClosure CompilerをインクリメンタルDOMのクロージャー版で使用することができました(ソースからビルドする必要があります)。

それは次の行で始まります:

var patch = goog.require('incrementaldom').patch; 
をそして patch機能がスコープで利用できるようになります:私は定期的にJSでそれを使用していたのであれば、私のように入力し

goog.module('incrementaldom'); 

私のコードの。しかし、@JsInterop注釈付きクラスからアクセスできるようにするにはどうすればよいですか?

私のような何か試してみました:

public class IncrementalDom { 

    @JsMethod(namespace = "incrementaldom", name = "patch") 
    public static native void patch(Element element, Patcher patcher); 

    @JsFunction 
    @FunctionalInterface 
    public interface Patcher { 
    void apply(); 
    } 

} 

をしかし、それは動作しません。私は、実行時にこのエラーが表示されます。

(TypeError) : Cannot read property 'patch' of undefined 

だから、私は何とかincrementaldomモジュールまたは少なくともだけpatch方法を公開しなければならないと思います。しかし、私はどのように知りません。

答えて

0

一日中戦った後、解決策が見つかりました。 goog.module: an ES6 module like alternative to goog.provide文書では、goog.scopeという役割に関する欠落した情報が見つかりました。機能が必要なモジュールはスコープ内の呼び出し内でのみ表示されます。

私はincrementaldom.jsという名前の別の閉鎖JSファイル作成:

goog.provide('app.incrementaldom'); // assures creation of namespace 
goog.require("incrementaldom"); 

goog.scope(function() { 
    var module = goog.module.get("incrementaldom"); 
    var ns = app.incrementaldom; 
    app.incrementaldom.patch = module.patch; 
}); 

goog.exportSymbol("app.incrementaldom", app.incrementaldom); 

をそして今、私はこのようなJavaコードからそれを呼び出すことができます。

public class IncrementalDom { 

    @JsMethod(namespace = "app.incrementaldom", name = "patch") 
    public static native void patch(Element element, Patcher patcher); 

    @JsFunction 
    @FunctionalInterface 
    public interface Patcher { 
    void apply(); 
    } 

} 

それでも私は、元のモジュールにエクスポートされたすべてのオブジェクトを定義する必要があります別々にClosure JSファイルに保存します。幸いにも私はpatchメソッドが必要です。私はある日、@JsInteropgoog.moduleの方が厄介な方法を見つけることを願っています:(

関連する問題