0

SimplePanel を拡張し、onLoad() メソッドでいくつかの JSNI を実行するウィジェットを作成しました。

public class AceEditor extends SimplePanel implements HasText {

  private JavaScriptObject editor;

  @Override
  protected void onLoad() {
    super.onLoad();
    editor = createEditor(getElement());
  }

  private static native JavaScriptObject createEditor(Element element) /*-{
      return $wnd.ace.edit(element);
  }-*/;

  @Override
  public native void setText(String value) /*-{
      this.@org.obiba.opal.web.gwt.ace.client.AceEditor::editor.setValue(value);
  }-*/;

  @Override
  public final native String getText() /*-{
      return this.@org.obiba.opal.web.gwt.ace.client.AceEditor::editor.getValue();
  }-*/;

}

問題はsetText、初めて呼び出すとき、ウィジェットがまだ接続されていないことです (onLoadまだ呼び出されていません)。

このウィジェットを で使用しますUiBinder

ウィジェットが接続されているかどうかを使用addAttachHandlerして確認できましたが、正しい方法ではないようです...

ウィジェットがすぐに接続されない理由について何か考えはありますか?

4

2 に答える 2

2

ウィジェットがすぐに接続されない理由について何か考えはありますか?

RootPanel定義上、既にアタッチされている親 (または に既に追加されている別のもの) に追加するまで、「アタッチ」されるべきではありませんRootPanel。あなたはそうしましたが、onLoadまだ呼ばれていませんか?

JS ツール (この場合aceは ) が DOM ノードの存在を必要とする場合、何かを行うために呼び出されるのを待つ必要はありませんonLoad。Widget サブクラスのコンストラクターが終了した時点で、既に要素を指定している必要があります。

操作を実行する前に、この要素をドキュメントにアタッチする必要がある場合は、もちろん、onLoad が呼び出されるまで待つ必要があります。

于 2013-02-14T02:53:46.487 に答える
2

onload の代わりに createEditor の呼び出しをコンストラクターに入れることはできますか?

ページが読み込まれる前にコードが setText を呼び出しているようです。
その場合は、コンストラクターで createEditor を呼び出すのが適切なはずです。

于 2013-02-13T21:22:53.817 に答える