代码之家  ›  专栏  ›  技术社区  ›  jose

EXTJS 5-标记字段或组合框-显示和隐藏表单字段

  •  1
  • jose  · 技术社区  · 10 年前

    我想根据多选组合框(tagfield)中选择的项目动态显示和隐藏表单中的字段。

    在组合框中选择的每个项目都有几个关联的隐藏表单字段(待显示)。

    字段具有属性“hidden:true”;

    我可以显示字段,但当我从组合框字段或反标记字段中删除项目时,我无法隐藏它们。

    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"]
    

    请你给我一些纠正代码的建议。

    注:很抱歉,下一篇文章之前放错了地方

    我试图实施你的建议,但没有成功(初学者的困难)。

    我的代码:

     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不是函数

    你能帮我提更多的建议吗。

    谢谢。

    1 回复  |  直到 10 年前
        1
  •  1
  •   rixo    10 年前

    实际上,您的代码有一个逻辑缺陷。您使所有字段可见,但当您删除第三个标记时,会发生什么?您在组合框中循环当前选定的标记,当您显示它时 ["itemone", "itemtwo"] ,里面没有“第三项”。最后一个例子,可能隐藏第三个字段的例子是注释执行。第二个和第一个标记也是如此。

    相反,我会在每个字段中循环,如果标记被选中,则显示它,如果标记未选中,则隐藏它。您可以使用 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玩得开心!