0

我花了很多时间调试组件中的策略错误。该组件具有禁用/启用按钮,但我还没有看到效果。过了一会儿,我注意到,按钮在我创建的最后一个组件实例中发生了变化。声明看起来是这样的:

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

在调试中,我已经看到,当我创建对象的第二个实例时:

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

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

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

4

2 回答 2

1

我想那CustomComponent是一个小部件?然后你做错了一些事情。你在你做的事情constructor(我想那是为了填充你的小部件属性?)甚至没有必要,因为当你使用dijit/_WidgetBase.

与您的属性相同,domNode如果您使用它,默认情况下它也已经存在dijit/_WidgetBase

我的猜测是,通过重写构造函数来执行此操作,您实际上是在执行 WidgetBase 应该执行的一些步骤,从而弄乱了属性的私有范围。

一个示例小部件:

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

此代码与您的小部件完全相同,并且要短得多。

具有实例范围属性的示例JSFiddle(如您在控制台日志中所见)。

于 2013-10-18T13:11:47.977 回答
1

我已经更准确地检查了这个问题。问题是,声明块只执行一次,因此创建了对象原型,其值被复制到实例中。

因此,当我这样做时buttons: {},我会创建对象,然后将其复制给所有孩子。最后,所有孩子都有相同的 buttons实例——我创建了一个准静态字段。

当我在构造函数中创建对象时,所有错误都消失了:

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

现在我的组件的每个实例都有自己的buttons对象。

事实上,我的问题在这里得到了准确的描述:

dojo.declare("my.classes.bar", my.classes.foo, {
  someData: [1, 2, 3, 4], // doesn't do what I want: ends up being 
于 2013-10-18T13:28:13.517 回答