Как отобразить Ext.FormPanel во всплывающем окне в Ext JS?

#javascript #extjs #popup

#javascript #extjs #всплывающее окно

Вопрос:

Я могу создать «окно подтверждения» в Ext JS следующим образом:

введите описание изображения здесь

с помощью этого кода:

 ...
listeners: {
    'afterrender' : function(p) {
        p.header.on('click', function(e, h) {
            Ext.MessageBox.confirm('Confirm', 'Are you sure you want to EDIT this?', function(btn) {
                var button_answer = new Ext.Panel({
                    title: 'Invoice Address',
                    width: 290,
                    height: 200,
                    html: 'you clicked the '   btn   ' button for EDIT',
                    frame: true,
                    border: true,
                    header: true
                });
                replaceComponentContent(small_box_upper_left, button_answer, true);
            });
        }, p, {
            delegate: '.panel_header_icon2',
            stopEvent: true
        });
    },
 ...
  

Как я могу создать всплывающее окно с затемненным фоном, подобное этому, но вместо окна сообщения в нем есть Ext.FormPanel? например, как я могу поместить этот код во всплывающее окно с затемненным фоном?

 new Ext.FormPanel({
        frame:true,
        labelWidth: 90,
        labelAlign: 'right',
        title: 'Orderer Information',
        bodyStyle:'padding:5px 5px 0',
        width: 300,
        height: 600,
        autoScroll: true,
        itemCls: 'form_row',
        defaultType: 'displayfield',
        items: [{
                fieldLabel: 'Customer Type',
                name: 'customerType',
                allowBlank:false,
                value: 'Company'
            },{
                fieldLabel: 'Company',
                name: 'company',
                value: 'The Ordering Company Inc.'
            },{
                fieldLabel: 'Last Name',
                name: 'lastName',
                value: 'Smith'
            }]
    });
  

Ответ №1:

Вы можете сделать это с помощью окна, потому что MessageBox не имеет никакой конфигурации для добавления панели.

И чтобы отобразить маску, просто установите параметру конфигурации modal значение true.

  win = new Ext.Window(
    {
        layout: 'fit',
        width: 500,
        height: 300,
        modal: true,
        closeAction: 'hide',
        items: new Ext.Panel(
        {
           items: //Your items here
        })
    });
  

Ответ №2:

Я нашел довольно простой способ расширить / взломать класс MessageBox, чтобы позволить вам передавать пользовательские компоненты, которые будут отображаться в теле.

 /**
 * Simple hack of MessageBox to allow the user to pass in some custom components (such as a form) that will be added to
 * the body of the MessageBox.
 * 
 * Keep in mind:
 * 
 * - You must create each component using Ext.create() before passing it in, rather than using an xtype
 * - MessageBox uses an Anchor layout for its body, so use Anchor layout syntax with your components
 * - Use bodyStyle: {background: 'none'} to get rid of a clashing background issue
 */
Ext.define('My.CustomMessageBox', {
    extend: 'Ext.window.MessageBox',
    /**
     * @cfg customItems An array of user-created components to add to the body of the MessageBox
     */
    customItems: [],
    initComponent: function() {
        var me = this;

        me.callParent();

        me.promptContainer.add(me.customItems);
    }
});
  

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

Недостатком этого является то, что это своего рода взлом, использующий свойство (promptContainer), которое не является частью общедоступного API. Так что Сенча может изменить это в любое время. Однако по сравнению с альтернативой либо заставить ваше пользовательское окно выглядеть и вести себя точно так же, как MessageBox (внешний вид и поведение которого также могут быть изменены Sencha в будущем), либо запустить вашу собственную систему Windows для каждого отдельного диалога в вашем приложении, я не возражаю против этого.

Ответ №3:

это очень просто!

 var msgbox = Ext.create('Ext.window.MessageBox',{});
var component = this.myReferences().comp;
msgbox.add(component);
msgbox.show();