Как центрировать кнопку в ее контейнере в Ext JS 4?

Я использую Ext JS 4 для создания веб-сайта, и мне нужно центрировать кнопку в ее контейнере, но я не могу этого добиться.

Я искал в Интернете информацию о том, как это сделать, и нашел несколько ответов, в которых говорится об использовании layout, но в моем случае это не сработало:

const submit = Ext.create('Ext.Button', {
    text     : 'search',
    scale: 'large',
    renderTo : Ext.getBody(),
    listeners: {
    click: function() {

        }
    },
    layout: {
        align: 'middle',
        pack: 'center',
        type: 'hbox'
    },
});

Весь мой код:

function init(results, checkInDate, checkOutDate, array) {
    if (results! = "") {
        results = JSON.parse(results);
    }
    const todaysDate = new Date();
    var visitDay = todaysDate.getDate();
    var visitMonth = todaysDate.getMonth()+1;
    var visitYear = todaysDate.getFullYear();
    var leavingDay = todaysDate.getDate();
    var leavingMonth = todaysDate.getMonth()+1;
    var leavingYear = todaysDate.getFullYear();
    var array1 = new Array();
    var i2 = 0;
    var i3 = 1;
    for(var i = 0; i<array.length; i++) {
        array1.push({ 'name': array[i],  'price1': results[i2],  'price2': results[i3]})
        i2 = i2 + 2;
        i3 = i3 + 2;
    }

    Ext.application({
        name: 'MyApp',
        launch: function() {
            const datePickers = Ext.create('Ext.form.Panel', {
                renderTo: Ext.getBody(),
                width: 300,
                bodyPadding: 10,
                items: [{
                    xtype: 'datefield',
                    format: 'd/m/Y',
                    anchor: '100%',
                    fieldLabel: 'Check In:',
                    name: 'from_date',
                    value: checkInDate,
                    listeners: {
                        'change': function(me) {
                            const visitDate = me.getSubmitValue();
                            visitMonth = '';
                            visitYear = '';
                            visitDay = '';
                            for(var i=0; i<2; i++) {
                                visitDay = visitDay + visitDate.charAt(i);
                            }
                            for(var i=3; i<5; i++) {
                                visitMonth = visitMonth + visitDate.charAt(i)
                            }
                            for(var i=6; i<10; i++) {
                                visitYear = visitYear + visitDate.charAt(i);
                            }
                        }
                    }
                }, {
                    xtype: 'datefield',
                    format: 'd/m/Y',
                    anchor: '100%',
                    fieldLabel: 'Check Out:',
                    name: 'to_date',
                    value: checkOutDate,
                    listeners: {
                        'change': function(me) {
                            const leavingDate = me.getSubmitValue();
                            leavingMonth = '';
                            leavingYear = '';
                            leavingDay = '';
                            for(var i=0; i<2; i++) {
                                leavingDay = leavingDay + leavingDate.charAt(i);
                            }
                            for(var i=3; i<5; i++) {
                                leavingMonth = leavingMonth + leavingDate.charAt(i)
                            }
                            for(var i=6; i<10; i++) {
                                leavingYear = leavingYear + leavingDate.charAt(i);
                            }
                        }
                    }
                }]
            });

            //This is the item I want to center:
            const submit = Ext.create('Ext.Button', {
                text     : 'Search',
                scale: 'large',
                renderTo : Ext.getBody(),
                listeners: {
                    click: function() {

                    }
                }
            });

            var store = Ext.create('Ext.data.Store', {
                storeId:'prices',
                fields:['name', 'price1', 'price2'],
                proxy: {
                    type: 'memory',
                    reader: {
                        type: 'json',
                        root: 'items'
                    }
                }
            });

            const grid = Ext.create('Ext.grid.Panel', {
                store: Ext.data.StoreManager.lookup('prices'),
                columns: [
                    { text: 'Name',  dataIndex: 'name', width: 200},
                    { text: 'Price1', dataIndex: 'price1', width: 135},
                    { text: 'Price2', dataIndex: 'price2', width: 135},
                ],
                renderTo: Ext.getBody()
            });

            store.getProxy().data = array1;
            store.load();

            Ext.create('Ext.container.Viewport', {
                layout: 'border',
                items: [{
                    title: 'Filter',
                    region: 'west',
                    collapsible: true,
                    split: true,
                    titleCollapse: true,
                    items: [
                        {  
                            items: datePickers
                        },
                        {
                            //I want to center this button horizontally:
                            items: submit
                        }

                    ],          
                }, {
                    title: 'prices',
                    region: 'center',
                    collapsible: false,
                    items: {
                        items: grid
                    }
                }]
            });
        }
    });
}

Итак, на данный момент кнопка отображается в этом положении:

Как центрировать кнопку в ее контейнере в Ext JS 4?

Но я бы хотел, чтобы там было:

Как центрировать кнопку в ее контейнере в Ext JS 4?

Любые идеи о том, как этого добиться?

Заранее спасибо!

Обновлено: ответ кода pvlt

Ext.create('Ext.container.Viewport', {
    layout: 'border',
    items: [{
       title: 'Filter',
       region: 'west',
       collapsible: true,
       split: true,
       titleCollapse: true,
       width: 300,
       layout: {
           type: 'hbox',
           align: 'middle',
           pack: 'center',
       },
           items: [
              {
                   items:datePickers
              },
              {
                   items: submit
              }
           ],           
       }, {
            title: 'prices',
            region: 'center',
            collapsible: false,
            items: {
               items: grid
            }
       }]
});
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
273
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны обернуть кнопку отправки, чтобы она работала.

{
  width: 300,
  layout: {
    type: 'hbox',
    align: 'middle',
    pack: 'center',
  },
  items: [{
    items: submit
  }]
}

Макет должен быть свойством контейнера обертки.

Спасибо! Я только что попробовал ваш код, но он не работает. Смотрите скриншот: i.imgur.com/uJGwV1F.png помните, что у меня также есть два средства выбора даты в одном контейнере. Я добавил в свой основной пост код, который я изменил в соответствии с вашим ответом.

user10021033 09.04.2019 13:02

Хорошо, посмотри на мой рабочий пример

pvlt 09.04.2019 13:07

Большое спасибо! Это сработало. Очевидно, я неправильно добавлял код. Кроме того, мне интересно кое-что, если я могу спросить об этом здесь. Почему в вашей скрипте у вас нет синих разделителей между каждым элементом, а у меня они есть? Есть ли способ отключить их?

user10021033 09.04.2019 13:19

Похоже, что есть какая-то проблема с css.

pvlt 09.04.2019 13:23

скорее всего мешает конфиг renderTo.

Martin Zeitler 09.04.2019 13:24

Да renderTo лишнее. Но в моей скрипке это тоже есть и ладно

pvlt 09.04.2019 13:31

Тогда это странно, я даже пытался скопировать весь код @pvlt из их скрипки, и да, то же самое. Меня это не смущает, но я думаю, что без бордюров он выглядит лучше.

user10021033 09.04.2019 13:39

renderTo: Ext.getBody() бессмысленно, ибо datePickers и submit...

Это можно сделать проще с помощью ->, что является сокращением от xtype: 'tbfill'.

tbar: ['->', submit, '->']

Я только что попробовал это, но это не работает, и в консоли появляется эта ошибка... i.imgur.com/pur37X8.png

user10021033 09.04.2019 13:32

@AdriánT95 думаю, что это должно быть tbar (панель инструментов) вместо items. -> должен существовать в ExtJS4. эта трассировка стека мало что говорит, если не знать, к какому объекту она относится. Ext.container.Viewport должен быть единственным предметом, у которого есть renderTo: Ext.getBody()... потому что он делает то, что говорит.

Martin Zeitler 09.04.2019 13:51

@AdriánT95 вам может понадобиться Ext.require() этот Внеш.кнопка.Кнопка. похоже, вы не используете SenchaCmd, который уже при сборке должен был жаловаться на неизвестный xtype. Ext.application в целом работает по-другому, поскольку вы используете его там (без renderTo)... API также показывает, что renderTo применяется только к самому верхнему элементу в иерархии.

Martin Zeitler 09.04.2019 14:03

Другие вопросы по теме