1

GWT エディターを説明するには長すぎる (そしておそらく不正確である) と思います。また、自分自身がエディターの仕組みについて初歩的な理解を持っていると考えているためです。だから、簡潔さのために私を責めないでください。

これは、エディター変数を uibinder テンプレートに結び付ける私のコードです。

@Path("canon.doer") 
@UiField ShenandoerEditor shanonEditor;

@path 仕様のため、エディターを遅延ロードすることは不可能のようです。

この問題を実証するには、遅延読み込みを行わなくても、このように構造を切り離します。

@UiFactory ShenandoerEditor mkShanonEditor{
    return new ShenandoerEditor();
}

GWT.create 中にエラーが発生する

「ゲッターパスが見つかりませんでした...

GWT エディターの遅延読み込みを可能にするために私が取ることができる戦略はありますか?

4

2 に答える 2

2

問題は、エディター ジェネレーターがエディターを返すメソッドを調べるため、mkShanonEditorメソッドをサブエディターのゲッターとして扱うことです。がないため、メソッド名を使用して編集されたオブジェクト内のパス@Pathを推測し、とを試しますが、編集されたオブジェクトでそのようなゲッターを見つけられません。mkShanonEditormkShanon

mkShanonEditorで注釈を付けるだけです@Editor.Ignore

ここで、遅延読み込み部分については、遅くとも を作成する必要があります。そうしShenandoerEditorないValueAwareEditor#setValueと、エディターはそれを入力しません。

于 2013-02-14T09:43:28.583 に答える
1

後でフォームを表示する前に値をプッシュするために、エディターはウィジェットを実際に使用するためにウィジェットへの参照を持っている必要があります。あなたが求めているのは、編集者shanonEditorがnullに気付くことができ、後で(いつ?割り当てたとき?フォームが表示されたとき?)もう一度チェックして、サブ値の受け渡しを再試行することです。これは意味がなく、編集者がどのように機能するかということでもありません。

代わりに、このフィールドに事前入力することを検討してください。つまり、怠惰にしないでください。現在、怠惰にすることでどれだけの利益を得ていますか?これらすべての構築を延期するために、この怠惰にしていcreateAndBindますか?エディターだけを積極的に作成し、asWidget / createAndBindまでパネルなどをオフのままにしておくことはできますか?

IsWidgetそうだとすると、直接実装するか拡張するかのどちらかLazyPanelであり、それらのサブエディターを描画することをほぼ確実に望んでいると仮定します(まだ、つまり、決して望まないのではなく、1、2秒待ちます)。リーフ値エディター(フィールドなど)とサブエディター(サブパネル)を作成しますが、各ステップで、実際に必要になるまで、これらの構成パーツをパネルに実際に組み立てるのを延期します。これには、呼び出す必要がある@UiField(provided=true)前にこれらのフィールドに値が入力されていることを示すことが含まれる可能性があります。createAndBind

public class CompanyEditor implements Editor<Company>, IsWidget {
    interface Binder extends UiBinder<Widget, CompanyEditor> {}
    private static final Binder binder = GWT.create(Binder.class);

    @UiField(provided = true)
    TextBox name = new TextBox();

    @UiField(provided = true)
    PersonEditor owner = new PersonEditor();

    private Widget root;

    @Override
    public Widget asWidget() {
        if (root == null) {
            root = binder.createAndBind(this);
        }
        return root;
    }
}

public class PersonEditor implements Editor<Person>, IsWidget {
    interface Binder extends UiBinder<Widget, CompanyEditor> {}
    private static final Binder binder = GWT.create(Binder.class);

    @UiField(provided = true)
    TextBox firstName = new TextBox();

    @UiField(provided = true)
    TextBox lastName = new TextBox();

    @UiField(provided = true)
    @Path("address.city")
    TextBox city = new TextBox();

    private Widget root;
    @Override 
    public Widget asWidget() {
        if (root == null) {
            root = binder.createAndBind(this);
        }
        return root;
    }
}
于 2013-02-14T02:46:40.877 に答える