1

GWT アプリでインクリメンタル DOM ライブラリを使用したいと考えています。

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

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

次の行で始まります。

goog.module('incrementaldom');

したがって、通常の JS で使用する場合は、次のように入力します。

var patch = goog.require('incrementaldom').patch;

そして、patch関数は私のコードの範囲で利用可能になります. @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メソッドのみを公開する必要があると思います。しかし、方法がわかりません。

4

1 に答える 1

0

一日中戦った後、私は解決策を見つけました。goog.module : an ES6 module like alternative to goog.provideドキュメントで、関数の役割に関する情報が欠落していることがわかりましたgoog.scope。必要なモジュールはスコープ呼び出し内でのみ表示されます。

次の名前の別の Closure JS ファイルを作成しましたincrementaldom.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方法だけです。@JsInteropいつの日か、面倒な方法を見つけることを願っていますgoog.module:(

于 2017-05-26T21:26:08.250 に答える