2013-10-18 52 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)提到了同样的事情。 –