Объявление 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