ExtJS 5.0 - 添加按钮作为组件的覆盖
ExtJS 5.0 - adding button as overlay to component
我们正在使用第三方提供的软件,我们不能修改它,只能使用覆盖。
我想创建一个新按钮并将其覆盖在文本输入的顶部,以便它们靠在一起。
我无法对齐叠加层,而是它显示在屏幕的左上角。因此,它当然不会与文本输入对齐。示例代码如下,在这种情况下,在调用 this.callParent([]);
之后在视图 initComponent
覆盖中实现。
var viewport = Ext.ComponentQuery.query('viewport')[0];
var overlay = viewport.add({
xtype: 'panel',
fullscreen: true,
left: 0,
top: 0,
width: 120,
height: 40,
items:[{
xtype: 'button',
text: 'Find Address',
handler: function() {
alert('Got it!');
}
}],
styleHtmlContent: true
});
var textField = this.query('*[itemId=textField]')[0];
overlay.showBy(textField, 'c-c?');
我尝试过使用 floating: true
和许多其他方法。
一旦我把它放到正确的位置,有没有办法让按钮正确响应 Tab 键顺序?也就是说,从文本字段中跳出,然后让按钮获得焦点?
根据您的问题我了解到,您在为组件设置位置时遇到了问题。如果是问题,您可以设置 xy 坐标。看看这个 fiddle:
https://fiddle.sencha.com/#fiddle/tpl
viewport.down('#idOverlay').setXY([150, 140]);
编辑:
Ext.define('OverriddenViewport', {
override: 'ExampleViewPort',
initComponent: function() {
// Set up first
this.callParent([]);
this.add(overlay);
this.addListener('afterrender', function(viewport) {
viewport.down('#idOverlay').setXY([220,50]);
viewport.down('#idButton').addListener('blur', function(button) {
viewport.down('#idTextfield').focus();
console.log('textfield is focussed');
});
viewport.down('#idTextfield').addListener('blur', function(button) {
viewport.down('#idButton').focus();
console.log('button is focussed');
});
});
}
});
如果您可以访问源代码(只是为了四处看看),您也许可以创建相应 class 的覆盖。创建覆盖,并将 class(表单?)的所有代码复制到覆盖中。
这里有一些关于在 ExtJs 中创建覆盖的附加信息:
http://moduscreate.com/writing-ext-js-overrides/
https://sencha.guru/2014/12/04/abstract-vs-override/
在您的覆盖中创建一个 trigger(在您要扩展的字段上),其中包含您的功能:
{
fieldLabel: 'My Custom Field',
triggers: {
foo: {
cls: 'my-foo-trigger',
handler: function() {
console.log('foo trigger clicked');
}
}
}
}
我们正在使用第三方提供的软件,我们不能修改它,只能使用覆盖。
我想创建一个新按钮并将其覆盖在文本输入的顶部,以便它们靠在一起。
我无法对齐叠加层,而是它显示在屏幕的左上角。因此,它当然不会与文本输入对齐。示例代码如下,在这种情况下,在调用 this.callParent([]);
之后在视图 initComponent
覆盖中实现。
var viewport = Ext.ComponentQuery.query('viewport')[0];
var overlay = viewport.add({
xtype: 'panel',
fullscreen: true,
left: 0,
top: 0,
width: 120,
height: 40,
items:[{
xtype: 'button',
text: 'Find Address',
handler: function() {
alert('Got it!');
}
}],
styleHtmlContent: true
});
var textField = this.query('*[itemId=textField]')[0];
overlay.showBy(textField, 'c-c?');
我尝试过使用 floating: true
和许多其他方法。
一旦我把它放到正确的位置,有没有办法让按钮正确响应 Tab 键顺序?也就是说,从文本字段中跳出,然后让按钮获得焦点?
根据您的问题我了解到,您在为组件设置位置时遇到了问题。如果是问题,您可以设置 xy 坐标。看看这个 fiddle: https://fiddle.sencha.com/#fiddle/tpl
viewport.down('#idOverlay').setXY([150, 140]);
编辑:
Ext.define('OverriddenViewport', {
override: 'ExampleViewPort',
initComponent: function() {
// Set up first
this.callParent([]);
this.add(overlay);
this.addListener('afterrender', function(viewport) {
viewport.down('#idOverlay').setXY([220,50]);
viewport.down('#idButton').addListener('blur', function(button) {
viewport.down('#idTextfield').focus();
console.log('textfield is focussed');
});
viewport.down('#idTextfield').addListener('blur', function(button) {
viewport.down('#idButton').focus();
console.log('button is focussed');
});
});
}
});
如果您可以访问源代码(只是为了四处看看),您也许可以创建相应 class 的覆盖。创建覆盖,并将 class(表单?)的所有代码复制到覆盖中。
这里有一些关于在 ExtJs 中创建覆盖的附加信息:
http://moduscreate.com/writing-ext-js-overrides/
https://sencha.guru/2014/12/04/abstract-vs-override/
在您的覆盖中创建一个 trigger(在您要扩展的字段上),其中包含您的功能:
{
fieldLabel: 'My Custom Field',
triggers: {
foo: {
cls: 'my-foo-trigger',
handler: function() {
console.log('foo trigger clicked');
}
}
}
}