Объявление Dojo - область свойств по умолчанию (экземпляр или статический)

Я потратил много времени на отладку странной ошибки в моем компоненте. У этого компонента есть кнопки включения / выключения, но я не видел эффекта. Через некоторое время, как я заметил, кнопки меняются в последнем экземпляре компонента, который я создал. Декларация выглядит так:

  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 ответа

Решение

Я предполагаю, что CustomComponent такое виджет? Тогда вы делаете что-то неправильно. То, что вы делаете в своем constructor (Я полагаю, что для заполнения свойств вашего виджета?) Даже не нужно, так как это уже по умолчанию, когда вы используете dijit/_WidgetBase,

То же самое с вашей собственностью domNode, он также там уже по умолчанию, если вы используете dijit/_WidgetBase,

Я предполагаю, что, переопределяя конструктор таким образом, вы фактически делаете некоторые шаги, которые должна выполнять WidgetBase, и таким образом портите частную область действия свойств.

Пример виджета:

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

Этот код делает то же самое, что и ваш виджет, и намного короче.

Пример JSFiddle, который имеет свойства области экземпляра (как вы можете видеть в журнале консоли).

Я проверил проблему более точно. Проблема в том, что блок объявлений выполняется только один раз, поэтому создается прототип объекта, значения которого копируются в экземпляры.

Поэтому, когда я делаю 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 
Другие вопросы по тегам