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 回答