2013-01-05 26 views
2

我目前一個用戶定義的類中創建一個對話框:訪問對話框中的回調方法與代理

$("<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(); 

,但我在尋找周圍的一種方式。

+0

如果想獲得這兩個對象,你會受益是使用'proxy'改變背景 – charlietfl

+0

'$(e.target).closest的( '.ui-dialog-buttonpane')。prev()'會給你主元素 – charlietfl

+0

http://jsbin.com/uwidah/1/edit'this'指向初始元素,怎麼了? –

回答

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/

相關問題