2013-10-16 53 views
0

我在使用dojo/_base/declare創建的類對象時遇到了一些概念性問題。dojo.declare創建的對象如何訪問自己的屬性?

我創建了以下模塊:

define(["dojo/_base/declare", ....], function(declare,....){ 
    return declare('my.widget', null ,function(..){ 
    startup: function() { 
     .... 
     new Button({onClick: this.newItem}, newButtonNode) 
    }, 
    newItem: function() { 
     this.openDialog({}, this.saveItemCallback) 
    }, 
    openDialog: function(item,callback){...}, 
    saveItemCallback: function(item){....} 
    }) 
}) 

的問題是,該功能newItem不能正常工作,因爲當它從點擊按鈕調用,this點按鈕組件,而不是到「 my.widget'實例。

我很困惑。我怎樣才能引用'my.widget'實例?在我讀過的Dojo類中,當前實例在this下可用。

+0

對於'openDialog'函數,請記住,有時它[返回'Promise'](http://dojotoolkit.org/documentation/tutorials/1.9/promises/)更清晰,而不需要回調參數。 – Darien

回答

1

如果您想用正確的範圍調用newItem,則可以使用dojo/_base/lang,hitch()函數。

hitch()功能將確保該this引用是正確的。這聽起來像是真正的魔法,但它使用屏幕背後的某種反射來執行該功能。

它確實使用Function.prototype.apply函數來啓動魔法。正如你可以在this article中看到的那樣,它接受一個上下文和參數。所以當執行newItem時,它實際上會改變this參考。

+0

好的,但這不是問題。問題是,對於newItem函數,'this'是Button,而不是'myInstance'。 'myInstance'僅在「啓動」功能中可見。 –

+0

@ŁukaszL。修復。這與Chris Hayes發佈的內容幾乎相同,但採用了新的AMD語法。 – g00glen00b

+0

Yest,這就是它!我仍然有問題的理解,什麼'栓'正在做。 –

0

您可以使用dojo.hitch到上下文連接到一個功能:

define(["dojo/_base/declare", ....], function(declare,....){ 
    var myFunc = dojo.hitch(this, function() { 
     this.openDialog({}, this.saveItemCallback) 
    }); 

    return declare('my.widget', null ,function(..){ 
    startup: function() { 
     .... 
     new Button({onClick: this.newItem}, newButtonNode) 
    }, 
    newItem: myFunc, 
    openDialog: function(item,callback){...}, 
    saveItemCallback: function(item){....} 
    }) 
}) 

通過這樣做,您實際上指出傳遞給dojo.hitch匿名函數中,this是指傳遞的第一個參數(這可能是任何對象)。

+0

通過這樣做我甚至在創建對象之前在myFunc聲明中出現了錯誤:'this.openDialog is undefined' –