Angular.JS實(shí)現(xiàn)無限級的聯(lián)動菜單(使用demo)
前言
之前給大家介紹過一篇關(guān)于AngularJS中實(shí)現(xiàn)無限級聯(lián)動菜單的文章,但沒來得及和大家分享使用的示例,下面這篇文章就來給大家分享下幾個使用的demo。
文中包括demo如下:
1. 同步加載子選項(xiàng)demo
2. 異步加載子選項(xiàng)demo
3. 初始值回填demo
4. 倒金字塔依賴demo
注意:在閱讀本文前請先移步上一篇文章:http://www.dhdzp.com/article/78126.htm
1. 同步加載子選項(xiàng)
在各聯(lián)動菜單加載之前,我們已經(jīng)通過某種方式(比如后端渲染、api依賴、deferred依賴等等)拿到了渲染各級菜單所需的各種數(shù)據(jù),我們只需要將該數(shù)據(jù)處理為
[{
text: 'some text',
value: 'some value'
},]
的形式,并封裝成數(shù)據(jù)源函數(shù)即可。以省-市聯(lián)動為例:
html部分:
注意第二個select中聲明了dependents="province" ,以此實(shí)現(xiàn)聯(lián)動
<select multi-level-select source="getProvinces" name="province" ng-model="form.province" empty="請選擇省份"></select> <select multi-level-select source="getCities" name="city" ng-model="form.city" empty="請選擇城市" dependents="province"></select>
controller部分:
預(yù)處理數(shù)據(jù),提供數(shù)據(jù)源函數(shù)
controller('myCtrl', ['$scope', function ($scope) {
// angular使用好習(xí)慣,將primitive值放到對象上
var form = {};
$scope.form = form;
var data = [{
name: '浙江',
id: 10,
cities: [{
name: '杭州',
id: 100
}, {
name: '寧波',
id: 101
}, {
name: '溫州',
id: 102
}]
}, {
name: '廣東',
id: 20,
cities: [{
name: '廣州',
id: 200
}, {
name: '深圳',
id: 201
}, {
name: '佛山',
id: 202
}]
}, {
name: '山東',
id: 30,
cities: [{
name: '濟(jì)南',
id: 301
}, {
name: '青島',
id: 302
}, {
name: '煙臺',
id: 303
}]
}];
var provinces = [];
var citiesLookup = {};
// 預(yù)處理,返回[{text: 'some text', value: 'some value'},]的數(shù)據(jù)格式
$.each(data, function (index, province) {
provinces.push({
text: province.name,
value: province.id
});
var cities = [];
$.each(province.cities, function (index, city) {
cities.push({
text: city.name,
value: city.id
});
});
citiesLookup[province.id] = cities;
});
$scope.getProvinces = function () {
return provinces;
};
$scope.getCities = function (values) {
return citiesLookup[values.province] || [];
};
}]);
2. 異步加載子選項(xiàng)demo
主要差異是數(shù)據(jù)源函數(shù)應(yīng)該返回promise實(shí)例(AngularJS中使用$q即可)。為了演示方便,這里就不用$http了,除了預(yù)處理(由使用者自己的業(yè)務(wù)邏輯負(fù)責(zé))外,完全一樣。
和上一個例子非常相似,只需要將兩個數(shù)據(jù)源函數(shù)修改為:
$scope.getProvinces = function () {
return $q(function (resolve) {
// 異步時應(yīng)返回promise,這里就不用http了,除了預(yù)處理(由使用者自己的業(yè)務(wù)邏輯負(fù)責(zé))外,完全一樣
// 如果需要緩存,也請?jiān)谶@里自己負(fù)責(zé)
$timeout(function () {
resolve(provinces);
}, 100);
});
};
$scope.getCities = function (values) {
return $q(function (resolve) {
$timeout(function () {
resolve(citiesLookup[values.province] || []);
}, 100);
});
};
3. 初始值回填
因?yàn)樵陂_發(fā)初期這個需求就很明確了,所以使用上不需要做額外的工作,如果有初始值,只需要在controller中為其賦值即可:
// angular使用好習(xí)慣,將primitive值放到對象上
var form = {};
$scope.form = form;
form.province = 30;
form.city = 301;
4. 倒金子塔依賴
依賴聲明是通過由逗號分割的字符串的形式完成的,使用上非常方便。
設(shè)想以下的場景:
教務(wù)處需要學(xué)生對課程進(jìn)行評價(jià),學(xué)生先選擇周幾,再選擇時間,然后再選擇具體的課程下拉框
周幾和時間之間互不依賴,課程下拉框同時依賴于周幾和時間,換言之,一旦周幾和時間中的任意一個改變,課程下拉框就應(yīng)該更新。
html部分:
注意第三個select的dependents屬性是day,hour,即同時依賴于day和hour
<select multi-level-select source="getDays" name="day" ng-model="form.day" empty="請選擇周幾"></select> <select multi-level-select source="getHours" name="hour" ng-model="form.hour" empty="請選擇時間"></select> <select multi-level-select source="getCourses" name="course" ng-model="form.course" empty="請選擇課程" dependents="day,hour"></select>
controller部分:
和前面的例子類似,沒有什么特殊的,預(yù)處理數(shù)據(jù)并提供數(shù)據(jù)源函數(shù)即可。
controller('myCtrl', function ($scope) {
var form = {};
$scope.form = form;
$scope.getDays = function () {
var days = '一二三'.split('');
days.forEach(function (item, index) {
days[index] = {
text: '星期' + item,
value: '星期' + item
};
});
return days;
};
$scope.getHours = function () {
return [{
text: '09:00-12:00',
value: '1'
}, {
text: '14:00-17:00',
value: '2'
}];
};
var courses = {
'星期一': {
'1': [{
value: '數(shù)學(xué)',
text: '數(shù)學(xué)'
}, {
value: '精讀',
text: '精讀'
}],
'2': [{
value: '足球',
text: '足球'
}]
},
'星期二': {
'1': [{
value: '聽力',
text: '聽力'
}],
'2': [{
value: '數(shù)學(xué)',
text: '數(shù)學(xué)'
}]
},
'星期三': {
'1': [{
value: '計(jì)算機(jī)',
text: '計(jì)算機(jī)'
}],
'2': [{
value: '游泳',
text: '游泳'
}, {
value: '古漢語',
text: '古漢語'
}]
},
};
$scope.getCourses = function (values) {
if (!values.day || !values.hour) {
return [];
}
return courses[values.day][values.hour];
};
});
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
- AngularJS實(shí)現(xiàn)樹形結(jié)構(gòu)(ztree)菜單示例代碼
- 實(shí)例詳解AngularJS實(shí)現(xiàn)無限級聯(lián)動菜單
- AngularJS折疊菜單實(shí)現(xiàn)方法示例
- AngularJS實(shí)現(xiàn)的select二級聯(lián)動下拉菜單功能示例
- Angular.js與Bootstrap相結(jié)合實(shí)現(xiàn)手風(fēng)琴菜單代碼
- AngularJS動態(tài)菜單操作指令
- AngularJS+Bootstrap3多級導(dǎo)航菜單的實(shí)現(xiàn)代碼
- AngularJS模糊查詢功能實(shí)現(xiàn)代碼(過濾內(nèi)容下拉菜單排序過濾敏感字符驗(yàn)證判斷后添加表格信息)
- angularjs+bootstrap菜單的使用示例代碼
- Angluar+zorro實(shí)現(xiàn)無限級菜單
相關(guān)文章
AngularJS實(shí)現(xiàn)與Java Web服務(wù)器交互操作示例【附demo源碼下載】
這篇文章主要介紹了AngularJS實(shí)現(xiàn)與Java Web服務(wù)器交互操作的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了AngularJS前臺ajax提交與javascript后臺處理的完整流程與實(shí)現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-11-11
詳解Monaco?Editor中的Keybinding機(jī)制
這篇文章主要為大家介紹了詳解Monaco?Editor中的Keybinding機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
淺談Angular4實(shí)現(xiàn)熱加載開發(fā)旅程
本篇文章主要介紹了淺談Angular4實(shí)現(xiàn)熱加載開發(fā)旅程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
AngularJS $http模塊POST請求實(shí)現(xiàn)
本篇文章主要介紹了AngularJS $http模塊POST請求實(shí)現(xiàn),這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
解決Angular2 router.navigate刷新頁面的問題
今天小編就為大家分享一篇解決Angular2 router.navigate刷新頁面的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
AngularJS實(shí)現(xiàn)自定義指令與控制器數(shù)據(jù)交互的方法示例
這篇文章主要介紹了AngularJS實(shí)現(xiàn)自定義指令與控制器數(shù)據(jù)交互的方法,結(jié)合具體實(shí)例形式分析了AngularJS自定義指令的實(shí)現(xiàn)以及與控制器數(shù)據(jù)交互的操作技巧,需要的朋友可以參考下2017-06-06
Angular 2父子組件數(shù)據(jù)傳遞之@ViewChild獲取子組件詳解
這篇文章主要給大家介紹了關(guān)于Angular 2父子組件數(shù)據(jù)傳遞之@ViewChild獲取子組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07

