Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   измененить свойство базового класса (https://javascript.ru/forum/extjs/8649-izmenenit-svojjstvo-bazovogo-klassa.html)

nikolaich 07.04.2010 12:11

измененить свойство базового класса
 
Создаю класс.
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();
});

Kolyaj 07.04.2010 17:29

Так не получится. В данном случае придётся создавать ещё один класс, наследуемый от MyWindow, у которого в initComponent добавлять в this.buttons ещё одну кнопку (до вызова родительского initComponent). Или же добавить в MyWindow возможность указания дополнительных кнопок в отдельном свойстве.

nikolaich 07.04.2010 18:53

Спасибо.
Первый вариант, предложенный Вами я пробовал. А вот как должен выглядеть второй не могу понять.

Если не трудно, можно пример вот для этого:
"Или же добавить в MyWindow возможность указания дополнительных кнопок в отдельном свойстве".

Kolyaj 07.04.2010 19:23

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'}
    ]
 
             
});

nikolaich 07.04.2010 19:40

Спасибо.

serega063 06.07.2010 12:13

А можно поподробней расписать первый вариант?

Kolyaj 06.07.2010 12:18

initComponent: function() {
    this.buttons.add({text: 'button'});
    MyClass.superclass.initComponent.apply(this, arguments);
}

Как-то так.

nikolaich 06.07.2010 16:23

Появился еще один вопрос.
Создаю один класс. От него наследую второй. Во втором тремя способами прописываю свойство 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();
}

Kolyaj 06.07.2010 16:32

У вас массив содержится в свойстве myArr прототипа конструктора firstWindow. Т.е. этот массив один на все объекты, порождаемые конструктором firstWindow и наследуемыми (в данном случае ещё и secondWindow).

Вообще со свойствами, содержащими ссылки на объекты, надо быть поаккуратней, и стараться определять их в initComponent.

nikolaich 06.07.2010 16:44

Т.е. получается, если я использую push(), то просто работаю с массивом, который прописан в самом верхнем классе.
А в двух первых вариантах я просто свойству присваиваю массив. Т.е. этому свойству присваиваю ссылку уже на другой массив.
Что-то типа такого?


Часовой пояс GMT +3, время: 07:54.