使用代理的回调方法中的访问对话框

时间:2013-01-05 22:12:10

标签: javascript jquery jquery-ui

我目前正在用户定义的类中创建一个对话框:

$("<div>").dialog(buttons: {
   'one': function () {
      $(this).dialog('close').dialog('destroy');
   }
});

以上工作正常,但this不再引用上述函数中的类实例。我可以使用$.proxy来解决这个问题:

...buttons: {
   'one': $.proxy(function () {
      this.doWork();
   }, this)

然后,我可以在单击对话框按钮时调用类方法。

但是,我仍然需要在对话框元素本身上调用.dialog('close').dialog('destroy')。使用this重新定义$.proxy后,如何在按钮回调中访问该元素? e.target指的是按钮本身。

我也意识到我可以这样做:

var obj = this;
...buttons: {
   obj.doWork();

但我正在寻找解决方法。

1 个答案:

答案 0 :(得分:0)

我不确定你为什么要在类的范围内避免var obj = this;,但唯一的另一种方法是使用自动调用的闭包,它实际上是相同的。为了引用这两个上下文,您需要将类引用存储在另一个变量中。

关闭:

function MyClass() {
    this.createDialog = function () {
        $("<div>").dialog({
            buttons: {
                "one": function (self) {
                    return  function (e) {
                        self.doWork();
                        $(this).dialog("close").dialog("destroy");
                    };
                }(this)
            }
        });
    };

    this.doWork = function () {
        // do work
    };
}

$(function () {
    var obj = new MyClass();

    $(".createDialog").click(function () {
        obj.createDialog();
    });
});

jsFiddle:http://jsfiddle.net/ar4ZL/