измененить свойство базового класса
Создаю класс.
MyWindow = Ext.extend(Ext.Window,{
initComponent: function(){
var config = {
width: 500,
height: 300
};
Ext.apply(this, Ext.apply(this.initialConfig, config));
MyWindow.superclass.initComponent.apply(this, arguments);
},
buttons: [{text: 'First Button'},
{text: 'Second Button'}
]
});
Дальше при создании объекта этого класса как мне добавить третью кнопку в создаваемое окно?
Ext.onReady(function() {
win = new MyWindow({
buttons: ?
});
win.show();
});
|
Так не получится. В данном случае придётся создавать ещё один класс, наследуемый от MyWindow, у которого в initComponent добавлять в this.buttons ещё одну кнопку (до вызова родительского initComponent). Или же добавить в MyWindow возможность указания дополнительных кнопок в отдельном свойстве.
|
Спасибо.
Первый вариант, предложенный Вами я пробовал. А вот как должен выглядеть второй не могу понять. Если не трудно, можно пример вот для этого: "Или же добавить в MyWindow возможность указания дополнительных кнопок в отдельном свойстве". |
MyWindow = Ext.extend(Ext.Window,{
initComponent: function(){
var config = {
width: 500,
height: 300
};
Ext.apply(this, Ext.apply(this.initialConfig, config));
if (this.extraButtons) {
// Добавляем кнопки из extraButtons в this.buttons.
// Но this.buttons.push здесть использовать нельзя, иначе эти кнопки добавятся в прототип.
// Проще всего клонировать this.buttons, после чего добавить новые.
// Вариантов много впрочем.
}
MyWindow.superclass.initComponent.apply(this, arguments);
},
buttons: [{text: 'First Button'},
{text: 'Second Button'}
]
});
|
Спасибо.
|
А можно поподробней расписать первый вариант?
|
initComponent: function() {
this.buttons.add({text: 'button'});
MyClass.superclass.initComponent.apply(this, arguments);
}
Как-то так. |
Появился еще один вопрос.
Создаю один класс. От него наследую второй. Во втором тремя способами прописываю свойство myArr. Затем создаю объект первого класса. Вызываю метод. В первых двух вариантах выводит пустое сообщение. А в третьем, то что я занес в свойство myArr, когда создавал класс secondWindow. Почему так?
firstWindow = new Ext.extend(Ext.Window,{
myArr: [],
width:200,
height:200,
initComponent: function(){
var config = {};
firstWindow.superclass.initComponent.apply(this, arguments);
Ext.apply(this, Ext.apply(this.initialConfig, config), firstWindow.superclass.initialConfig);
}, // end init
doAlert:function(){
Ext.Msg.alert('test', this.myArr['0'] + this.myArr['1']);
}
});
// создаю наследник
secondWindow = new Ext.extend(firstWindow,{
initComponent: function(){
var config = {};
// 1- й вариант работы с свойством в видем массива
//var a = [];
//a.push('first');
//a.push(' test');
//this.myArr = a;
// 2-й вариант работы с свойством в видем массива
//this.myArr = ['second',' test'];
// 3-й вариант работы с свойством в видем массива
this.myArr.push('third');
this.myArr.push(' test');
secondWindow.superclass.initComponent.apply(this, arguments);
Ext.apply(this, Ext.apply(this.initialConfig, config), secondWindow.superclass.initialConfig);
}
});
win = new firstWindow({});
Ext.onReady(function() {
win.doAlert();
}
|
У вас массив содержится в свойстве myArr прототипа конструктора firstWindow. Т.е. этот массив один на все объекты, порождаемые конструктором firstWindow и наследуемыми (в данном случае ещё и secondWindow).
Вообще со свойствами, содержащими ссылки на объекты, надо быть поаккуратней, и стараться определять их в initComponent. |
Т.е. получается, если я использую push(), то просто работаю с массивом, который прописан в самом верхнем классе.
А в двух первых вариантах я просто свойству присваиваю массив. Т.е. этому свойству присваиваю ссылку уже на другой массив. Что-то типа такого? |
| Часовой пояс GMT +3, время: 20:51. |