[ExtJS]设置级联菜单的默认值

简介:

前言

   ExtJS在修改这样的页面上赋值是很方便的,在正文中1.2.1代码中可以看出,一行代码就可以搞定,但这是对于普通控件而言,如文本框。对于ComboBox可没这么简单...

 

版本

  Ext JS Library 3.0.0

 

正文

  一、问题

    1.1  截图

       

    1.2  代码

      1.2.1  前端代码

复制代码
     < script type = " text/javascript " >
        
//
         function  ExtStore(url)
        {
            
return   new  Ext.data.Store({
                proxy: 
new  Ext.data.HttpProxy({
                    url: url
                }),
                reader: 
new  Ext.data.JsonReader({
                    totalProperty: 
' count ' ,
                    root: 
' result '
                },
                [
                    { name: 
' Id '  },
                    { name: 
' Name '  }
                ])
            });
        }
        
        Ext.onReady(
function () {
            Ext.QuickTips.init();
            Ext.form.Field.prototype.msgTarget 
=   ' side ' ;
            
            
var  store1  =  ExtStore( ' combox.aspx?method=GetProvinces ' );
            
var  store2  =  ExtStore( ' combox.aspx?method=GetCitys ' );
            
            
var  combo2  =  ComboBox( ' combo2 ' , ' 二级菜单 ' ,store2);
            
var  combo1  =   new  Ext.form.ComboBox({
                mode: 
' remote ' ,
                fieldLabel:
' 一级菜单 ' ,
                name:
' combo1 ' ,
                editable : 
false ,
                typeAhead: 
true ,
                triggerAction: 
' all ' ,
                displayField:
' Name ' ,
                valueField:
' Id ' ,
                selectOnFocus:
true ,
                store:store1,
                listeners: {
                    
' select ' function (combo, record){
                        
var  id  =  record.get( ' Id ' );
                        
if (id)
                        {
                            
// 清空二级菜单选项
                            combo2.setRawValue( '' );
                            store2.proxy 
=   new  Ext.data.HttpProxy({
                                url:String.format(
' combox.aspx?method=GetCitys&Province={0} ' ,id)
                            });
                            store2.load();
                        }
                    }
                }
            });
            
            
var  form1  =   new  Ext.FormPanel({
                layout: 
' form ' ,
                autoHeight: 
true ,
                frame: 
true ,
                renderTo: Ext.getBody(),
                title: 
' <center style="curor:hand" onclick="window.location.reload();">表单控件</center> ' ,
                style: 
' margin-left:auto;margin-right:auto;width:500px;margin-top:8px; ' ,
                
// 设置标签对齐方式
                labelAlign:  ' right ' ,
                
// 设置标签宽
                labelWidth:  170 ,
                
// 设置按钮的对齐方式
                buttonAlign: ' center ' ,
                
// 默认元素属性设置
                defaults:{  width: 180    },
                items: [
                    combo1,
                    combo2
                ]
            });
            
            
// 加载数据
            Ext.Ajax.request({
                url: 
' combox.aspx?method=Detail ' ,
                method: 
' GET ' ,
                callback: 
function  (options, success, response) {
                    
if (success  &&  response.status  ==   200 ){
                        
// 将值批量赋值
                        form1.form.setValues(Ext.util.JSON.decode(response.responseText))
                    }
                }
            }); 
        });
    
< / script>
复制代码

      1.2.2  后台代码

复制代码
     static  IList < Combox >  Provinces  =   new  List < Combox > ();
    
static  IDictionary < int , Combox >  Citys  =   new  Dictionary < int , Combox > ();

    
static  combox()
    {
        Provinces.Add(
new  Combox() { Id  =   1 , Name  =   " 湖南省 "  });
        Provinces.Add(
new  Combox() { Id  =   2 , Name  =   " 广东省 "  });

        Citys.Add(
1 new  Combox()
        {
            Id 
=   1 ,
            Name 
=   " 长沙市 "
        });

        Citys.Add(
2 new  Combox()
        {
            Id 
=   1 ,
            Name 
=   " 岳阳市 "
        });

        Citys.Add(
3 new  Combox()
        {
            Id 
=   2 ,
            Name 
=   " 深圳市 "
        });

        Citys.Add(
4 new  Combox()
        {
            Id 
=   2 ,
            Name 
=   " 珠海市 "
        });
    }

    
protected   void  Page_Load( object  sender, EventArgs e)
    {

    }

    
///   <summary>
    
///  获取所有省份数据
    
///   </summary>
    
///   <returns></returns>
     public   void  GetProvinces()
    {
        Response.Write(
new  StringBuilder().Append( " {count: " )
            .Append(Provinces.Count)
            .Append(
" ,result: " )
            .Append(JavaScriptConvert.SerializeObject(Provinces))
            .Append(
' } ' )
            .ToString());
    }

    
///   <summary>
    
///  获取省下面的市区数据
    
///   </summary>
    
///   <returns></returns>
     public   void  GetCitys()
    {
        IList
< Combox >  result  =   new  List < Combox > ();
        
int  Province  =  Convert.ToInt32(Request.QueryString[ " Province " ]);
        
foreach  (KeyValuePair < int , Combox >  data  in  Citys)
        {
            
if  (data.Value.Id  ==  Province)
                result.Add(
new  Combox() { Id  =  data.Key, Name  =  data.Value.Name });

        }
        Response.Write(
new  StringBuilder().Append( " {count: " )
            .Append(result.Count)
            .Append(
" ,result: " )
            .Append(JavaScriptConvert.SerializeObject(result))
            .Append(
' } ' )
            .ToString());
    }

    
public   override   string  Detail()
    {
        IDictionary
< string int >  result  =   new  Dictionary < string int > ();
        result.Add(
" combo1 " 2 );
        result.Add(
" combo2 " 2 );
        
return  JavaScriptConvert.SerializeObject(result);
    }

    
class  Combox
    {
        
public   int  Id {  get set ; }
        
public   string  Name {  get set ; }
    }
复制代码

    1.3  代码说明

      1.3.1  后台代码中使用的数据仅用测试用

      1.3.2  意图:加载的时候就默认选择广东省——珠海市

 

  二、问题分析 

    ComboBox延迟加载导致。

 

  三、解决办法

    2.1  让ComboBox赋值后显示对应的Name,而不是Id

      在Ext.Ajax.request执行前加一句“store1.load();”即可。

       

    2.2  ComboBox级联赋值

      级联赋值可没这么简单了,需要手动触发事件,这里尝试了很长时间才出结果。

      2.2.1  第一步,手动触发一级菜单选择事件

复制代码
            store1.load();
            
            
// 加载数据
            Ext.Ajax.request({
                url: 
' combox.aspx?method=Detail ' ,
                method: 
' GET ' ,
                callback: 
function  (options, success, response) {
                    
if (success  &&  response.status  ==   200 ){
                        
// 将值批量赋值
                        form1.form.setValues(Ext.util.JSON.decode(response.responseText))
                        
                        
var  comboValue1  =  combo1.getValue();
                        
var  selectRecord;
                        store1.each(
function (record){
                            
if (record.data.Id  ==  comboValue1)
                                selectRecord 
=  record;
                        });
                        combo1.fireEvent(
' select ' ,combo1,selectRecord);
                    }
                }
            }); 
复制代码

        这里发现手动触发得自己传入record的参数,不然里面去不到值。

      2.2.2  修改级联

复制代码
                            store2.load({
                                callback :
function (r,options,success){
                                    
if (success){
                                        
if (IsLoad)
                                        {
                                            combo2.setValue(comboValue2);
                                            IsLoad 
=   false ;
                                        }
                                    }
                                }
                            });
复制代码

        代码说明:

          a).  IsLoad是全局变量,用来控制仅设置一次默认值

          b).  很容易又会犯触发菜单一就直接给菜单二赋值的错,注意这里因为菜单二还没有加载完,所有如果直接在触发事件后面写赋值,出来仍然是数字。

      2.2.3  最终效果图

        

 

  四、代码下载

    /Files/over140/2010/6/combox2010-6-12.rar

 

  五、维护

    5.1  2010-6-13

      此文对本文的问题有所启发:http://hi.baidu.com/pure_adoration/blog/item/7146f0264608730a908f9d5d.html

 

  六、转载保留

    博客园:http://www.cnblogs.com/

      农民伯伯:http://over140.cnblogs.com/

 

结束

  注意代码中的如PageBase、 ComboBox('combo2','二 级菜单',store2)之类的代码可以在我以前的文章里面找得到说明。遇到问题除了抱怨还可以选择消灭,那种解决后的快感是非常深刻的,这个问题很早就解决了,一直没时间写,现在仍然记得清晰 :)


转载:http://www.cnblogs.com/over140/archive/2010/06/12/1757235.html

目录
相关文章
|
2天前
|
人工智能 运维 安全
|
5天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
392 124
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
8天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
736 108
|
2天前
|
算法 Python
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
229 152
|
4天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
205 127
|
2天前
|
编解码 算法 自动驾驶
【雷达通信】用于集成传感和通信的OFDM雷达传感算法(Matlab代码实现)
【雷达通信】用于集成传感和通信的OFDM雷达传感算法(Matlab代码实现)
177 125
|
2天前
|
JavaScript 关系型数据库 MySQL
基于python的网上外卖订餐系统
本系统基于Python与Flask框架,结合MySQL数据库及Vue前端技术,实现了一个功能完善的网上订餐平台。系统涵盖餐品、订单、用户及评价管理模块,并深入研究订餐系统的商业模式、用户行为与服务质量。技术上采用HTML、PyCharm开发工具,支持移动端访问,助力餐饮业数字化转型。