我花了很多时间调试组件中的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')})
按钮已经设置 - 它们的实例由所有实例共享!
最后,我在我的组件中创建了一个静态变量。这不是我想要的!那个宣言有什么问题?我应该如何为每个组件实例分别设置“按钮”实例?
答案 0 :(得分:1)
我认为CustomComponent
是一个小部件?然后你做错了。您在constructor
(我想这是填充您的小部件属性?)中所做的事情甚至没有必要,因为当您使用dijit/_WidgetBase
时,默认情况下已经存在。
与您的媒体资源domNode
相同,如果您使用dijit/_WidgetBase
,则默认情况下也是如此。
我的猜测是,通过重写构造函数来执行此操作,您实际上正在执行WidgetBase应该执行的一些步骤,从而弄乱了属性的私有范围。
示例小部件:
var CustomComponent = declare("my/CustomComponent", [WidgetBase], {
grid: null,
data: [],
buttons: {}
});
此代码与您的小部件完全相同,并且更短。
具有实例作用域属性的示例JSFiddle(正如您在控制台日志中看到的那样)。
答案 1 :(得分:1)
我更准确地检查了这个问题。问题是,声明块只执行一次,因此创建对象原型,这些值复制到实例。
所以当我buttons: {}
时,我创建了Object,然后复制给所有孩子。在最终效果中,所有孩子都有相同的 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