30.01.2015, 10:11
|
Интересующийся
|
|
Регистрация: 30.01.2015
Сообщений: 11
|
|
Автовысота элементов
возникла неясность с ExtJS 5.
Хочу создать страницу с несколькими вкладками и чтобы содержимое каждой вкладки заполняло все пространство страницы, если же данные не помещаются, то появлялся скролл, при явном указании высоты - все хорошо, но хотелось бы иметь гибкий механизм, скорее всего я неправильно использую xtype и layout. Научите: как это побеждать?
вот, собственно, мой код:
Ext.QuickTips.init();
Ext.application({
name: 'MVVM',
views: [
'CarGrgid',
'RouteHeadGrid',
'CarForm',
],
controllers: [
'CarController',
'RouteHeadController'
],
stores: [
'CarStore',
'DriversStore',
'RouteHeadStore',
],
launch: function() {
Ext.tip.QuickTipManager.init();
Ext.create('Ext.panel.Panel', {
//Ext.create('Ext.container.Viewport', {
renderTo: Ext.getBody(), //document.body,
items: [{
xtype: 'tabpanel',
layout: 'fit',
items: [{
title: 'Список автомобилей',
layout: {
type: 'hbox',
align: 'stretch'
},
items: [{
height: 600,
xtype: 'panel',
layout: 'fit',
autoScroll: true,
//scroll: true,
flex: 1,
items: [{
xtype: 'mvvm-CarGrgidView',
}]
}, {
xtype: 'mvvm-CarFormView',
flex: 1
}]
}, {
title: 'Готовы к рейсу',
layout: 'fit',
items: [{
extend: 'Ext.panel.Panel',
requires: [
'Ext.layout.container.Table'
],
layout: {
type: 'table',
columns: 1,
tableAttrs: {
style: {
width: 600
}
},
},
items: [{
xtype: 'mvvm-RouteHeadFormView',
}, {
xtype: 'mvvm-RouteHeadGridView',
}]
}]
}, {
title: 'Список автомобилей',
//xtype: 'tabbar',
xtype: 'panel',
layout: 'fit',
height: 600,
//anchor: "100% 100%",
flex: 1,
items: [{
flex: 1,
//anchor:'100%',
title: 'Border Layout',
layout: 'border',
items: [{
title: 'South Region is resizable',
region: 'south', // position for region
xtype: 'panel',
//height: 100,
split: true, // enable resizing
flex: 1,
margin: '0 5 5 5',
layout: 'fit'
}, {
title: 'West Region is collapsible',
region: 'west',
xtype: 'panel',
margin: '5 0 0 5',
//width: 200,
flex: 1,
collapsible: true,
id: 'west-region-container',
layout: 'fit'
}, {
title: 'Center Region',
flex: 2,
region: 'center', // center region is required, no width/height specified
xtype: 'panel',
layout: 'fit',
margin: '5 5 5 5'
}, {
title: 'Center Region',
collapsible: true,
flex: 2,
region: 'east', // center region is required, no width/height specified
xtype: 'panel',
layout: 'fit',
}],
}]
}]
}]
});
}
});
Последний раз редактировалось sin_raben, 30.01.2015 в 10:18.
|
|
30.01.2015, 13:45
|
Интересующийся
|
|
Регистрация: 30.01.2015
Сообщений: 11
|
|
Неужели у всех все прекрасно тянется, и я один такой горемыка?
|
|
03.02.2015, 13:47
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
Да, есть замечания к использованию xtype и layout.
Представьте, что у вас есть блоки, которые несут содержание и блоки, которые нужны для распределения содержания. Последние называются контейнерами. Нарисуйте своё приложение сначала из одних контейнеров. Для этого используйте xtype: viewport, panel, tabpanel, container. Вместо блоков с содержанием, ставьте обычные панели, потом замените их на гриды, графики и прочее.
У каждого контейнера есть свойства layout и items. Если в материнском контейнере вы выбрали layout: hbox, то в дочерних контейнерах независимо от их собственного типа вы можете указать свойства flex, minWidth и прочие. Если вы выберите в материнском контейнере другой тип layout, то в дочерних контейнерах нужно указывать соответствующие ему настройки. Вот как свойство дочернего контейнера flex объяснено в документации материнского контейнера hbox: http://docs.sencha.com/extjs/5.1/5.1....HBox-cfg-flex
Ваш случай в упрощённом виде
Ext.application({
name: 'MVVM',
launch: function() {
Ext.create('Ext.container.Viewport', {
renderTo: Ext.getBody(),
layout: 'fit',
items: [{
xtype: 'tabpanel',
layout: 'fit',
items: [{
title: 'Список автомобилей',
xtype: 'panel',
autoScroll: true,
html: 'tttt<br>tttt<br>'
}, {
title: 'Готовы к рейсу',
xtype: 'panel'
}, {
title: 'Список автомобилей',
xtype: 'panel'
}]
}]
});
}
});
|
|
03.02.2015, 16:46
|
Интересующийся
|
|
Регистрация: 30.01.2015
Сообщений: 11
|
|
Спасибо за разъяснение. Постараюсь более осознанно применять свойства. А не подскажете, как определить какие свойства являются обязательными для того или иного элемента?
В частности если закомментировать указание высоты в контейнере bordera, то в консоли выскакивает такая ошибка:
"Border layout does not currently support shrinkWrap height. Please specify a height on component: panel-1061, or use a container layout that sets the component's height. "
Как следует поступать в подобной ситуации? Указывать высоту фиксированной, как я и сделал или есть более элегантные способы сделать высоту подогнанную под высоту экрана?
|
|
03.02.2015, 18:42
|
Профессор
|
|
Регистрация: 19.11.2012
Сообщений: 178
|
|
Это всё из-за того, что Вы, скорее всего, не используете viewport. В body нужно вставлять его. Изменил пример:
https://fiddle.sencha.com/#fiddle/hio
Ext.application({
name: 'MVVM',
launch: function() {
Ext.widget({
xtype: 'viewport',
renderTo: Ext.getBody(),
layout: 'fit',
items: [{
xtype: 'tabpanel',
activeTab: 2,
layout: 'fit',
items: [{
xtype: 'panel',
title: 'Список автомобилей',
autoScroll: true,
html: 'tttt<br>tttt<br>'
}, {
xtype: 'panel',
title: 'Готовы к рейсу'
}, {
xtype: 'panel',
title: 'Список автомобилей',
layout: 'border',
items: [{
xtype: 'panel',
title: 'South Region is resizable',
region: 'south', // position for region
split: true, // enable resizing
flex: 1,
margin: '0 5 5 5'
}, {
xtype: 'panel',
title: 'West Region is collapsible',
region: 'west',
margin: '5 0 0 5',
flex: 1,
collapsible: true
}, {
xtype: 'panel',
title: 'Center Region',
flex: 2,
region: 'center',
margin: '5 5 5 5'
}, {
xtype: 'panel',
title: 'Center Region',
collapsible: true,
flex: 2,
region: 'east'
}]
}]
}]
});
}
});
|
|
05.02.2015, 15:00
|
Интересующийся
|
|
Регистрация: 30.01.2015
Сообщений: 11
|
|
Спасибо Вам огромное, оказалось что я неправильно обернул элементы, из-за чего поплыла вся верстка, впредь буду узлы у которых большая вложенность реализовывать через отдельные объекты.
|
|
|
|