很多網友在問,Extjs4.0 ComboBox如何實現,好在之前用3.x實現過一個三級聯動,如今用Extjs4.0來實現同樣的聯動效果。其中注意的一點就是,3.x中的model:'local'在Extjs4.0中用queryMode: 'local'來表示,而且在3.x中Load數據時用reload,但是在extjs4.0中要使用load來獲取數據。如下圖:
代碼部分
先看HTML代碼:
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>MHZG.NET-城市三級聯動實例</title>
<link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
<script type="text/javascript" src="../../bootstrap.js"></script>
<script type="text/javascript" src="../../locale/ext-lang-zh_CN.js"></script>
<script type="text/javascript" src="combobox.js"></script>
</head>
<body>
</body>
</html>
簡單的很,就是加載了基本的CSS文件和JS文件,并且加載自定義的combobox.js文件。
combobox.js:
Ext.require('Ext.*');
Ext.onReady(function(){
//定義ComboBox模型
Ext.define('State', {
extend: 'Ext.data.Model',
fields: [
{type: 'int', name: 'id'},
{type: 'string', name: 'cname'}
]
});
//加載省數據源
var store = Ext.create('Ext.data.Store', {
model: 'State',
proxy: {
type: 'ajax',
url: 'city.asp?act=sheng&n='+new Date().getTime()+''
},
autoLoad: true,
remoteSort:true
});
//加載市數據源
var store1 = Ext.create('Ext.data.Store', {
model: 'State',
proxy: {
type: 'ajax',
url: 'city.asp?act=shi&n='+new Date().getTime()+''
},
autoLoad: false,
remoteSort:true
});
//加載區數據源
var store2 = Ext.create('Ext.data.Store', {
model: 'State',
proxy: {
type: 'ajax',
url: 'city.asp?act=qu&n='+new Date().getTime()+''
},
autoLoad: false,
remoteSort:true
});
Ext.create("Ext.panel.Panel",{
renderTo: document.body,
width:290,
height:220,
title:"城市三級聯動",
plain: true,
margin:'30 10 0 80',
bodyStyle: "padding: 45px 15px 15px 15px;",
defaults :{
autoScroll: true,
bodyPadding: 10
},
items:[{
xtype:"combo",
name:'sheng',
id : 'sheng',
fieldLabel:'選擇省',
displayField:'cname',
valueField:'id',
store:store,
triggerAction:'all',
queryMode: 'local',
selectOnFocus:true,
forceSelection: true,
allowBlank:false,
editable: true,
emptyText:'請選擇省',
blankText : '請選擇省',
listeners:{
select:function(combo, record,index){
try{
//userAdd = record.data.name;
var parent=Ext.getCmp('shi');
var parent1 = Ext.getCmp("qu");
parent.clearValue();
parent1.clearValue();
parent.store.load({params:{param:this.value}});
}
catch(ex){
Ext.MessageBox.alert("錯誤","數據加載失敗。");
}
}
}
},
{
xtype:"combo",
name:'shi',
id : 'shi',
fieldLabel:'選擇市',
displayField:'cname',
valueField:'id',
store:store1,
triggerAction:'all',
queryMode: 'local',
selectOnFocus:true,
forceSelection: true,
allowBlank:false,
editable: true,
emptyText:'請選擇市',
blankText : '請選擇市',
listeners:{
select:function(combo, record,index){
try{
//userAdd = record.data.name;
var parent = Ext.getCmp("qu");
parent.clearValue();
parent.store.load({params:{param:this.value}});
}
catch(ex){
Ext.MessageBox.alert("錯誤","數據加載失敗。");
}
}
}
},
{
xtype:"combo",
name:'qu',
id : 'qu',
fieldLabel:'選擇區',
displayField:'cname',
valueField:'id',
store:store2,
triggerAction:'all',
queryMode: 'local',
selectOnFocus:true,
forceSelection: true,
allowBlank:false,
editable: true,
emptyText:'請選擇區',
blankText : '請選擇區',
}
]
})
});
上述代碼中,如果在ComboBox直接定義store數據源,會出現這樣一種情況,那就是當選擇完第一個省,點擊第二個市的時候,會閃一下,再點擊,才會出現市的數據。那么要解決這樣的情況,那么必須先要定義好省、市、區的數據源。那么再點擊的時候,就不會出現上述情況了。
代碼中,使用store為省的數據,設置其autoLoad為true,那么頁面第一次加載的時候,就會自動加載省的數據,然后給省和市添加了監聽select,作用在于當點擊省的時候,要清空市和區的數據,并根據當前選定的值去加載對應的數據到市的數據源中。當然store1和store2原理是一樣的。
最后,服務端要根據傳的值進行數據檢索及返回正確數據,這里沒有從數據庫中查詢數據,而只是簡單的寫了一些測試代碼,相信extjs代碼沒有任何的問題了,那么服務端返回數據,就不是一件很重要的事情了。
City.asp:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Response.ContentType = "text/html"
Response.Charset = "UTF-8"
%>
<%
Dim act:act = Request("act")
Dim param : param = Request("param")
If act = "sheng" Then
Response.Write("[")
Response.Write("{""cname"":""北京市"",""id"":""110000""},")
Response.Write("{""cname"":""內蒙古自治區"",""id"":""150000""}")
Response.Write("]")
End If
If act = "shi" Then
If param = "110000" Then
Response.Write("[")
Response.Write("{""cname"":""市轄區"",""id"":""110100""},")
Response.Write("{""cname"":""市轄縣"",""id"":""110200""}")
Response.Write("]")
ElseIf param = "150000" Then
Response.Write("[")
Response.Write("{""cname"":""呼和浩特市"",""id"":""150100""},")
Response.Write("{""cname"":""包頭市"",""id"":""150200""}")
Response.Write("]")
End If
End If
If act = "qu" Then
If param = "110100" Then
Response.Write("[")
Response.Write("{""cname"":""朝陽區"",""id"":""110101""},")
Response.Write("{""cname"":""昌平區"",""id"":""110102""}")
Response.Write("]")
ElseIf param = "110200" Then
Response.Write("[")
Response.Write("{""cname"":""密云縣"",""id"":""110201""},")
Response.Write("{""cname"":""房山縣"",""id"":""110202""}")
Response.Write("]")
ElseIf param = "150100" Then
Response.Write("[")
Response.Write("{""cname"":""回民區"",""id"":""150101""},")
Response.Write("{""cname"":""新城區"",""id"":""150102""}")
Response.Write("]")
ElseIf param = "150200" Then
Response.Write("[")
Response.Write("{""cname"":""青山區"",""id"":""150201""},")
Response.Write("{""cname"":""東河區"",""id"":""150202""}")
Response.Write("]")
End If
End If
%>
以上就是本文的全部內容,希望對大家的學習有所幫助。