我想根据多选组合框(tagfield)中选择的项目动态显示和隐藏表单中的字段。
在组合框中选择的每个项目都有几个相关的隐藏表单字段(待显示)。
字段的属性为“hidden:true”;
我可以显示字段,但是当我从组合框字段或de tagfield中删除项目时,我无法隐藏它们。
listeners:{
select:function( combo, records, eOpts) {
var combo = Ext.ComponentQuery.query('#combo')[0];
var field = Ext.ComponentQuery.query('#A')[0];
var field1 =Ext.ComponentQuery.query('#B')[0];
var field2 =Ext.ComponentQuery.query('#C')[0];
var records = combo.getValue();
console.log(records);
for (var i = 0, count = records.length; i < count; i++) {
switch(records[i]) {
case 'itemone':
if(field.isHidden()) {
field.show();
}
else {
field.hide();
}
break;
case 'itemtwo':
if(field1.isHidden()) {
field1.show();
}
else {
field1.hide();
}
break;
case 'itemthree':
if(field2.isHidden()) {
field2.show();
}
else {
field2.hide();
}
break;
}
}
}
}
console.log(records)提供以下结果:
显示:
["itemone"]
["itemone", "itemtwo" ]
["itemone", "itemtwo", "itemthree"]
隐藏:
["itemone", "itemtwo"]
["itemone"]
请你给我一些纠正代码的建议。
注意:抱歉以前在错误的地方发布的帖子
我试图实施你的sugestions,但没有成功(初学者困难)。
我的代码:
listeners:{
select:function( combo, records, eOpts) {
var combo = Ext.ComponentQuery.query('#combo')[0];
var fields = Ext.ComponentQuery.query('[autoHideTag]');
var records = combo.getValue();
console.log(records);
for (var i = 0, count = records.length; i < count; i++) {
fields.setVisible(records.indexOf(fields.autoHideTag) !== -1 );
switch(records[i]) {
case 'itemone':
if(field.isHidden()) {
field.show();
}
else {
field.hide();
}
break;
case 'itemtwo':
if(field1.isHidden()) {
field1.show();
}
else {
field1.hide();
}
break;
case 'itemthree':
if(field2.isHidden()) {
field2.show();
}
else {
field2.hide();
}
break;
}
}
}
}
Firebug说:
TypeError:fields.setVisible不是函数
请帮助提出更多建议。
的Merci。
答案 0 :(得分:1)
确实,您的代码存在逻辑缺陷。您使所有字段都可见,但是当您删除第3个标记时,会发生什么?您循环播放组合中当前选定的标签,并在显示时,您有["itemone", "itemtwo"]
,其中没有“itemthree”。所以你的最后一个案例,可以隐藏第三个字段的那个是笔记执行。等等第二个和第一个标签。
我要做的是循环遍历每个字段,如果选择了标记则显示它,如果不是则隐藏它。例如,您可以使用records.indexOf('itemone') !== -1
来测试是否选择了标记。
另一个提示,我会使用一个具有独特名称的自定义属性,允许两者简化组件查询,并且无意识地知道标签以针对所选标签进行测试。
这就是我的意思......如果你这样定义你的领域:
{
xtype: 'textfield'
,autoHideTag: 'itemone' // custom marker
}
您可以在一个查询中获取所有字段:
// select all components with property autoHideTag resolving to something truthy
var fields = Ext.ComponentQuery.query('[autoHideTag]');
如果需要,可以使查询更具体,如果适用,可以使用“textfield [autoHideTag]”或“field [autoHideTag]”。
最后,您将知道要测试此字段的标记:
// setting a component visible or hidden when it is already the case has no side-effect
field.setVisible( records.indexOf(field.autoHideTag) !== -1 );
瞧。与Ext玩得开心!