ExtJS 设置级联菜单的默认值


Posted in Javascript onJune 13, 2010

前言

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

版本

Ext JS Library 3.0.0

正文

一、问题

1.1

截图

ExtJS 设置级联菜单的默认值

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();”即可。

ExtJS 设置级联菜单的默认值

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).

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

四、代码下载
/201006/yuanma/combox2010-6-12.rar
结束

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

Javascript 相关文章推荐
js加解密 脚本解密
Feb 22 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
Aug 05 Javascript
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
详解Document.Cookie
Dec 25 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
angular动态表单制作
Feb 23 Javascript
JS实现的RC4加密算法示例
Aug 16 Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 Javascript
如何使用JavaScript实现栈与队列
Jun 24 Javascript
小程序中canvas的drawImage方法参数使用详解
Jul 04 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
Nov 14 Javascript
js 未结束的字符串常量错误解决方法
Jun 13 #Javascript
JSON 和 JavaScript eval使用说明
Jun 13 #Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
Jun 13 #Javascript
js null undefined 空区别说明
Jun 13 #Javascript
javascript dom代码应用 简单的相册[firefox only]
Jun 12 #Javascript
DOM Scripting中的图片切换[兼容Firefox]
Jun 12 #Javascript
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 #Javascript
You might like
PHP Ajax实现页面无刷新发表评论
2007/01/02 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
php GUID生成函数和类
2014/03/10 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
js实现两个值相加alert出来精确到指定位
2013/09/25 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python通过ElementTree操作XML获取结点读取属性美化XML
2013/12/02 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
个人工作表现自我评价
2015/03/06 职场文书
反邪教教育心得体会
2016/01/15 职场文书