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 相关文章推荐
用javascript控制iframe滚动的代码
Apr 10 Javascript
Extjs学习笔记之九 数据模型(上)
Jan 11 Javascript
JQuery里选择超链接的实现代码
May 22 Javascript
Node.js中使用计时器定时执行函数详解
Aug 15 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
NW.js 简介与使用方法
Feb 01 Javascript
Vue2.0结合webuploader实现文件分片上传功能
Mar 09 Javascript
angular2 组件之间通过service互相传递的实例
Sep 30 Javascript
Vue中this.$nextTick的作用及用法
Feb 04 Javascript
js中调用微信的扫描二维码功能的实现代码
Apr 11 Javascript
vue中jsonp插件的使用方法示例
Sep 10 Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 11 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
咖啡的传说和历史
2021/03/03 新手入门
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
PHP内核探索之解释器的执行过程
2015/12/22 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
js 多浏览器分别判断代码
2010/04/01 Javascript
jquery实现带复选框的表格行选中删除时高亮显示
2013/08/01 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
微信小程序实现canvas分享朋友圈海报
2020/06/21 Javascript
Vue proxyTable配置多个接口地址,解决跨域的问题
2020/09/11 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[02:49]2018DOTA2亚洲邀请赛主赛事决赛日战况回顾 Mineski鏖战5局夺得辉耀
2018/04/10 DOTA
python变量不能以数字打头详解
2016/07/06 Python
python实现图片彩色转化为素描
2019/01/15 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
python 利用toapi库自动生成api
2020/10/19 Python
Java的五个基础面试题
2016/02/26 面试题
会议开场欢迎词
2014/01/15 职场文书
《钱学森》听课反思
2014/03/01 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
Python使用海龟绘图实现贪吃蛇游戏
2021/06/18 Python
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript