2013-10-18 85 views
0

我已經在我的部件花了很多時間調試strage錯誤的。該組件已禁用/啓用按鈕,但我沒有看到效果。過了一段時間,我注意到,按鈕在我創建的最後一個組件實例中發生了變化。聲明看起來如此:道場聲明 - 默認屬性(實例或靜態)範圍

constructor: function(options) { 
    for(var i in options){ 
     this[i] = options[i]; 
    } 
    }, 
    domNode: null, 
    grid: null, 
    data: [], 
    buttons: {}, 

在調試,我見過的,那個時候我創造我的對象的第二個實例:

new CustomComponent({domNode: dojo.byId('secondid')}) 

的按鈕都已經設置 - 它們的實例爲所有人共享實例!

在最終的效果,我在我的組件創建一個靜態變量。這不是我想要的!該聲明有什麼錯誤?我應該如何爲每個組件實例分別設置「按鈕」實例?

回答

1

我想這CustomComponent是一個小部件?那麼你做錯了一些東西。您在constructor(我想這是爲了填充您的小部件屬性?)所做的事情甚至沒有必要,因爲當您使用dijit/_WidgetBase時,它已經默認存在。

與您的財產domNode一樣,如果您使用dijit/_WidgetBase,它也會默認出現。

我的猜測是,通過重寫構造函數像這樣,你實際上在做的一些步驟,該WidgetBase應該做的,從而搞亂了性能的私人範圍。

一個例子部件:

var CustomComponent = declare("my/CustomComponent", [WidgetBase], { 
    grid: null, 
    data: [], 
    buttons: {} 
}); 

此代碼完全相同的小部件,是短了很多。

有實例作用域屬性(你可以在控制檯日誌中看到)的一個例子JSFiddle

+0

那麼技術上我的組件是一個小部件,但它不會從任何繼承。我認爲這不是問題,似乎declare中的所有內容都是原型,它被複制到子實例,所以通過按鈕:{}您創建一個新的Object,它將被複制到所有實例。所以正確的方法是在構造函數中創建該對象。 –

+0

你爲什麼不從WidgetBase繼承?它使事情變得容易很多,我沒有看到任何缺點。 – g00glen00b

+0

我不需要WidgetBase中的任何東西,至少我現在不知道任何這樣的東西:) –

1

我檢查了更準確的問題。問題是,該聲明塊只執行一次,因此創建對象原型,其值是複製到實例。

所以,當我做buttons: {},我創建對象,然後複製給所有的孩子。在最終效果,所有的孩子有相同buttons實例 - 我創建了一個準靜態字段。

在那裏走了,當我創建該對象在構造函數中的所有錯誤:

constructor: function(options) { 
    for(var i in options){ 
     this[i] = options[i]; 
    } 
    this.buttons = {} 
    this.data = [] 
    }, 

現在我的組件的每一個實例都有自己的buttons對象。

其實,我的問題是確切描述here

dojo.declare("my.classes.bar", my.classes.foo, { 
    someData: [1, 2, 3, 4], // doesn't do what I want: ends up being 
+2

它看起來像你自己想出了答案,但[這裏是文檔](http:// dojotoolkit.org/reference-guide/1.6/dojo/declare.html#arrays-and-objects-as-member-variables)爲什麼這是必要的。 –

+0

@ThomasUpton感謝您的鏈接,我用它來更新我的答案。那麼,這是Dojo的一個問題,你應該閱讀過時的文檔:) –

+0

我剛剛使用了dojo.declare的第一個結果,因爲它好像使用了1.6樣式的全局'dojo'對象。 [當前文檔](http://dojotoolkit.org/reference-guide/1.8/dojo/_base/declare.html#arrays-and-objects-as-member-variables)提到了同樣的事情。 –