Компоненты в Ext JS 4

Основы компонентов Ext JS 4

Весь пользовательский интерфейс в Ext JS 4 создается из специальных виджетов - компонентов. Все компоненты представляют собой подклассы класса Ext.Component. Данный класс и отвечает за создание, рендеринг, позиционирование и удаление компонентов.

Но компоненты сами по себе не могут существовать. Все они помещаются в некоторый контейнер. Контейнер представляет специальный компонент, который может включать другие компоненты. Стандартная, но не обязательная, иерархия компонентов может начинаться с класса Viewport, который затем включает остальные контейнеры и компоненты.

Каждый контейнер имеет свойство items, в котором можно установить дочерние элементы. Например, установим для контейнера Viewport две внутренних панели:

Ext.onReady(function(){
	var childPanel1 = Ext.create('Ext.panel.Panel', {
		title: 'Панель 1',
		html: 'Внутренняя панель 1'
	});

	var childPanel2 = Ext.create('Ext.panel.Panel', {
		title: 'Панель 2',
		html: 'Внутренняя панель 2'
	});

	Ext.create('Ext.container.Viewport', {
		items: [ childPanel1, childPanel2 ]
	});
});

XType и псевдонимы классов

Каждый компонент имеет алиас или псевдоним, который употребляется вместо имени класса при его создании объекта. Для этого у объекта устанавливается свойство xtype. Обычно классы имеют похожие псевдонимы, например, у класса Ext.panel.Panel псевдоним 'panel', а у класса Ext.Button псевдоним 'button'. Псевдонимы всех классов можно посмотреть в официальной документации по Ext JS 4.

Для чего они нужны? Перепишем вышеуказанный пример с использованием псевдонимов:

Ext.onReady(function(){
	Ext.create('Ext.container.Viewport', {
    items: [{
			xtype: 'panel',
			title: 'Панель 1',
			html: 'Внутренняя панель 1'
		},
		{
			xtype: 'panel',
			title: 'Панель 2',
			html: 'Внутренняя панель 2'
	}]
});
});

Таким образом, мы можем указать вместо полного имени класса краткий псевдоним. Это позволяет нам создавать более чистый код.

Рендеринг компонентов

Класс Ext.Component поддерживает две модели рендеринга: прямую (direct) и ленивую (lazy).

Прямой рендеринг происходит, когда компонент создается с указанием атрибута renderTo или applyTo.

Атрибут renderTo содержит ссылку на место, где будет происходить рендеринг компонента. Например:

Ext.onReady(function(){
	Ext.create('Ext.Panel', {
            title: 'Приложение Ext JS 4',
			width: 300,
			height: 200,
			renderTo: Ext.getBody()
        });
});

Выражение Ext.getBody() показывает, что панель будет рендерится в элементе body структуры DOM. Мы также могли бы использовать аналогичное выражение renderTo: document.body. Либо мы можем указать id любого элемента веб-страницы, в который хотим поместить компонент:

<html>
<head>
    <title>Hello Ext</title>
    <link rel="stylesheet" type="text/css" href="../extjs/resources/css/ext-all.css" >
    <script type="text/javascript" src="../extjs/ext-debug.js"></script>
	<script>
Ext.onReady(function(){
var bigPannel=Ext.create('Ext.Panel', {
            title: 'Приложение Ext JS 4',
			width: 300,
			height: 200,
			renderTo:'tiptop'
        });
});
</script>
</head>
<body>
<div id="tiptop" style="margin-top:50; margin-left:50; width:300; height:300;"></div>
</body>
</html>

Так рендеринг компонента будет производится сразу же после своего создания.

"Ленивый" или отложенный рендеринг предполагает, что мы сначала создаем компонент, а рендерим его уже по ходу:

Ext.onReady(function(){
	var bigPannel=Ext.create('Ext.Panel', {
            title: 'Приложение Ext JS 4',
			width: 300,
			height: 200
        });
//...тут остальной код
bigPannel.render(document.body);
//или рендеринг в элемент по id <div id="tiptop" ...
//bigPannel.render('tiptop');
});

Однако следует помнить, что мы не можем применить рендеринг, чтобы вложить один компонент Ext JS в другой. Для этого надо использовать свойство items контейнера-компонента, как было показано в начале главы.

Добавление и удаление элементов

В предыдущих примерах мы использовали свойство items, чтобы добавить в контейнер другие компоненты. Однако есть и другие способы, кроме того, может возникнуть необходимость добавить компоненты динамически в процессе выполнения кода.

Добавление компонентов в контейнер мы можем произвести с помощью методов add и insert. Метод add просто добавляет компонент в конец массива items контейнера:

Ext.onReady(function(){
var bigPannel=Ext.create('Ext.Panel', {
            title: 'Приложение Ext JS 4',
			width: 300,
			height: 200,
			id : 'bigPannel',
			renderTo: Ext.getBody()
        });
	Ext.getCmp('bigPannel').add({
			title: 'Внутренняя панель',
			width: 100,
			height: 100,
			html:'Привет мир!'
	});
});

Здесь мы указываем у контейнера свойство id, по которому мы можем взаимодействовать с этим элементом. Так, метод Ext.getCmp(id).add получает id контейнера и добавляет в него новый компонент.

Похожим образом действует метод insert, только он вставляет элемент по указанному индексу:

Ext.onReady(function(){
var bigPannel=Ext.create('Ext.Panel', {
            title: 'Приложение Ext JS 4',
			width: 300,
			height: 200,
			id : 'bigPannel',
			renderTo: Ext.getBody()
        });
	Ext.getCmp('bigPannel').insert(0, {
			title: 'Панель 1',
			width: 200,
			height: 80,
			html:'Панель 1'
	});
	Ext.getCmp('bigPannel').insert(0, {
			title: 'Панель 2',
			width: 200,
			height: 80,
			html:'Панель 2'
	});
});

Здесь мы создаем две панели, первая панель вставляется по индексу 0 - то есть на первое место. Потом мы также на первое место вставляем вторую панель, поэтому первая панель перемещается на второе место и в контейнере будет находиться ниже второй панели:

Удаление компонентов из контейнера производится с помощью метода remove, который принимает два параметра: первый (обязательный) - id компонента или ссылку на компонент, который надо удалить, и второй (необязательный) указывает, нужно ли при этом вызывать метод destroy у удаляемого компонента. Например:

var newPannel=Ext.create('Ext.Panel', {
			title: 'panel1'
			width: 300,
			height: 200,
			id : 'bigPannel'
        });
//.....прочая логика приложения
// удаляем по id
Ext.getCmp('bigPannel').remove('panel1');
// удаляем по ссылке
Ext.getCmp('bigPannel').remove(newPannel);

Второй параметр метода remove нередко употребляется для того, чтобы удалить компонент из одного контейнера и поместить его в новый контейнер, ведь при этом нам не нужно удалять элемент из приложения совсем, поэтому и метод destroy тут не нужен:

var newPannel=getCmp('panel1');
// удаляем с одной панели
Ext.getCmp('bigPannel').remove(newPannel, false);
// и добавляем в другой контейнер у которого id='newContainer'
Ext.getCmp('newContainer').add(newPannel);

Отображение и скрытие элементов

Чтобы скрыть и отобразить компонент, используются методы hide и show соответственно:

var bigPannel=Ext.create('Ext.Panel', {
            title: 'Приложение Ext JS 4',
			width: 300,
			height: 200,
			id : 'bigPannel',
			renderTo: Ext.getBody()
        });
		bigPannel.hide(); // скрываем компонент
		bigPannel.show(); // отображаем компонент

hideMode

Это свойство управляет, как компонент будет скрыт в структуре DOM. Оно может иметь три значения:

hidden

Если это свойство компонента имеет значение true, то элемент будет скрыт при создании

Размеры

Размеры компонента задаются свойствами width и height, для которых указывается значение в пикселях

html

Это свойство указывает на содержание компонента. Оно может принимать значение либо строки, либо отдельного объекта: html: '<b;gt;Текст</b>'.

Позиционирование

С помощью свойства margin можно задать отступ от внешней границы контейнера. Мы можем задать лишь одно число, которое будет использоваться для отступов во всех четырех направлениях, либо указать строку отступов: margin: '10 20 0 50'.

Чтобы позиционировать контент внутри компонента, используется свойство padding. Его действие аналогично свойству margin.

    Поддержать сайт на родительском проекте КГБ