0
public class SettingMailPage {
    @UiField
    ButtonElement save;
    @UiField
    AnchorElement input;


    SettingMailPage()
    {
       bindActions(save.cast(),input.cast());
    }


    private native void bindActions(JavaScriptObject save, JavaScriptObject input)
    /*-{
          $wnd.$(save).click(function () {
            $wnd.alert($wnd.$(input).size());//always 0, why?
          });
    }-*/;
}

コールバック中にバインド アクションが機能する理由と、その要素の選択に失敗した理由と回避策を知りたいです。ありがとう

編集:

   private native void bindActions(JavaScriptObject save, JavaScriptObject input)
    /*-{
          var thatInput=input;
          $wnd.$(save).click(function () {
            $wnd.alert($wnd.$(thatInput).size());
          });
    }-*/;

動作しますが、理由がわかりません。誰か説明してもらえますか?

4

1 に答える 1

2

bindActionsクリック コールバックの前に評価されるため、コールバックは、メソッドに渡されたときの状態で にアクセスする機会がありませんinput

これを行う唯一の方法は、参照を保持して状態をロックするか (賢く行ったように)、バインディング全体をクロージャーでラップすることです (非常に面倒で冗長です)。これは次のようになります。

private native void bindActions(JavaScriptObject save, JavaScriptObject input) /*-{

    (function(in) {
        $wnd.$(save).click(function () {
            $wnd.alert($wnd.$(in).size());
        });
    })(input);
}-*/;

コンテキストがすべてです。コールバック内では、関数の所有者(保存ボタン) を参照していることを思い出してください。この件については、quirksmode に関するとてつもなく有名な記事を参照してください。

于 2013-08-05T20:22:23.353 に答える