#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();