我有一个extjs表单面板。根据组合框中选择的值,我需要多次显示一个字段集。也就是说,如果选择的值为1,则显示一次设置字段;如果选择的值为2,则显示两次。
我面临的问题是,字段集只显示一次。因为,我正在更改字段集的标题,我可以更清楚地告诉显示的字段集是for循环的最后一次迭代中的字段集。
但是,我可以在js控制台中看到for循环的所有迭代的日志消息,这意味着循环正在正确执行。
这是我的代码:
Ext.define('ELM.view.cl.Edit', {
extend : 'Ext.form.Panel',
alias : 'widget.cform',
addMode : false,
layout : 'fit',
autoShow : true,
initComponent : function() {
this.items = this.buildItems();
this.callParent(arguments);
},
buildItems : function() {
return [ {
xtype : 'form',
id : 'details',
items : [
{
xtype : 'fieldset',
columnWidth : 0.5,
title : 'Details',
items : [
{
fieldLabel : 'Number Of Scripts Required',
xtype : 'combo',
name : 'noOfScriptsRequired',
id : 'noOfScriptsRequired',
store : new Ext.data.SimpleStore({
fields : [ 'no', 'val' ],
data : [['1','1'],['2','2'],['3','3']]
}),
displayField : 'no',
valueField : 'val',
listeners : {
select : function(combo, value) {
var formpanel = Ext.widget('cform');
var sd = this.up('form').getComponent(
'scriptdetails');
for ( var i=1; i<=combo.getValue();i++){
console.log(i);
var title="Script details "+i;
sd.setTitle(title);
sd.show();
sd.hidden = false;
console.log(sd);
}
}
}
}, ]
}, {
xtype : 'fieldset',
id : 'scriptdetails',
columnWidth : '0.5',
hidden : true,
title : 'Script Details',
items : [ {
xtype : 'textfield',
fieldLabel : 'Script Name',
name : 'scriptName'
} ]
}
]
} ];
}
});
更新:以下是工作代码:
{
fieldLabel : 'Name :',
xtype : 'textfield',
name : 'name'
},{
fieldLabel : 'Number Of Scripts Required',
xtype : 'combo',
name : 'noOfScriptsRequired',
id : 'noOfScriptsRequired',
store : new Ext.data.SimpleStore({
fields : [ 'no', 'val' ],
data : [ [ '1', '1' ], [ '2', '2' ],[ '3', '3' ] ]
}),
displayField : 'no',
valueField : 'val',
listeners : {
select : function(combo, value) {
var dynamicPanel = Ext.getCmp("dynamicPanel");
var scriptField = {
xtype : 'fieldset',
items : [
{
xtype : 'textfield',
fieldLabel : 'Script Name',
name : 'scriptName'
},
{
xtype : 'textfield',
fieldLabel : 'Script Parameters',
name : 'scriptParameters'
} ]
};
dynamicPanel.removeAll(true);
for ( var i = 0; i < combo.getValue(); i++) {
var index = dynamicPanel.items.length;
var j = i + 1;
scriptField.title = "Script Details "+ j;
dynamicPanel.insert(index,scriptField);
dynamicPanel.doLayout();
}
}
}
提前致谢
答案 0 :(得分:1)
您在fieldset中使用id:'scriptdetails'。在网页中,每个组件或元素都应具有唯一的ID。如果存在具有相同id的元素,则在渲染元素时会出现问题,例如单个元素呈现错误或元素可能无法呈现。
在您需要重复字段集的情况下,请勿使用固定ID。使用服务器中随机生成的id或使用ExtJS提供的“itemId”。
<强>更新强> 工作小提琴是here
Ext.onReady(function() {
var store = new Ext.data.ArrayStore({
id: 0,
fields: [
'myId',
'displayText'
],
data: [
[1, '1'],
[2, '2'],
[3, '3'],
]
});
var scriptField = {
xtype: 'fieldset',
columnWidth: '0.5',
title: 'Script Details',
items: [{
xtype: 'textfield',
fieldLabel: 'Script Name',
hiddenName: 'scriptName'
}]
};
var container = new Ext.Panel({
layout: 'hbox',
height: '700px',
items: [{
xtype: 'panel',
id: 'parentContainer',
height: '700px',
layout: 'form',
items: [{
xtype: 'combo',
editable: false,
triggerAction: 'all',
mode: 'local',
store: store,
valueField: 'myId',
displayField: 'displayText',
fieldLabel: 'Show Number of Items',
listeners: {
select: function(combo, value) {
var dynamicPanel = Ext.getCmp("dynamicPanel");
dynamicPanel.removeAll(true);
for (var i = 0; i < combo.getValue(); i++) {
scriptField.title = "Script Details " + i;
dynamicPanel.add(scriptField);
dynamicPanel.doLayout();
dynamicPanel.ownerCt.doLayout();
dynamicPanel.ownerCt.ownerCt.doLayout();
}
}
}
}, {
xtype: 'panel',
id: 'dynamicPanel',
items: []
}]
}]
});
container.render(Ext.getBody());
});
答案 1 :(得分:1)
您的buildItems代码在开头执行一次。之后,你永远不会真正添加任何项目。您希望使用此功能执行此操作:http://docs.sencha.com/extjs/4.2.2/#!/api/Ext.container.AbstractContainer-method-add
如果要添加项目,则必须创建一个新项目。您不能将同一项添加到容器中两次。因此,您必须动态创建它们:http://docs.sencha.com/extjs/4.2.2/#!/api/Ext-method-create
为此,您应该使用一些已定义的&#34; blueprint&#34;,您可以在其中定义它是一个字段集,包含一个文本字段,依此类推:http://docs.sencha.com/extjs/4.2.2/#!/api/Ext-method-define
项目的蓝图不应包含id。我会使用form.items[i]
来引用所有项目,并完全省略id。
但是仍然存在一个问题:您的项目都包含相同名称的文本字段。这对submit()
很有用。但这完全是另一个故事。