измененить свойство базового класса
Создаю класс.
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, время: 07:54. |