Dojo声明 - 默认属性的范围(实例或静态)

时间:2013-10-18 10:27:31

标签: javascript dojo requirejs declare dojo-1.9

我花了很多时间调试组件中的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')})

按钮已经设置 - 它们的实例由所有实例共享!

最后,我在我的组件中创建了一个静态变量。这不是我想要的!那个宣言有什么问题?我应该如何为每个组件实例分别设置“按钮”实例?

2 个答案:

答案 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