1

次のウィジェットを検討してください。そのうちの 2 つをページに追加します。最初のものは「widget1」という名前を取得し、2 番目のものは「widget2」という名前を取得します。独自の名前を付ける必要がありますが、javascript から呼び出されます。(この例は意味がありませんが、それがどのように行われるかを理解するための単純な例です。)

public class MyComponent extends Composite{

    String name;
    public MyComponent(String name) {
        this.name =name;

        Button b = new Button(name);
        b.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                myonclick();

            }
        });
        initWidget(b);
        declareMethod(this);
    }

    public native void declareMethod(MyComponent myWidget) /*-{
            $wnd.myWidget = myWidget;

    }-*/;

    public native void myonclick() /*-{
        $wnd.myWidget.@de.jsni.test.client.MyComponent::doSomething()();
    }-*/;

    public void doSomething() {
        Window.alert(name);
    }
}

私の問題は次のとおりです。両方のボタンがメッセージ「widget2」を警告します。これは、「declareMethod」で「myWidget」変数をオーバーライドしているためです。正しいオブジェクトの doSomething() メソッドを呼び出すにはどうすればよいですか? ここである種の名前空間アプローチを使用できますか?

4

2 に答える 2

1

あなたが抱えている問題は、MyComponentが作成され、$wnd.myWidgetそのアイテムを参照するように設定されている場合です。したがって、MyComponent#1を作成してから #2 を作成すると、MyComponent常に#2 になります。$wnd.myWidgetMyComponent

JS 変数を設定するメソッドを定義するのではなく、次のようにネイティブ メソッドでウィンドウを直接参照します。

public native void myonclick(MyComponent comp) /*-{
    comp.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;

次に、クリック ハンドラーで、myonclick次のように呼び出します。

@Override
public void onClick(ClickEvent event) {
     myonclick(MyComponent.this);
}

これはうまくいくはずだと思います。問題がある場合はお知らせください。お手伝いします。

更新: 以下を試すことができますが、正直なところ、外部の JavaScript でうまく動作するかどうかはわかりません。このユースケースを実際に処理する必要はありませんでした。

public native void myonclick() /*-{
    this.@de.jsni.test.client.MyComponent::doSomething()();
}-*/;
于 2013-06-13T21:09:40.477 に答える