Angular.JS實(shí)現(xiàn)無(wú)限級(jí)的聯(lián)動(dòng)菜單(使用demo)
前言
之前給大家介紹過(guò)一篇關(guān)于AngularJS中實(shí)現(xiàn)無(wú)限級(jí)聯(lián)動(dòng)菜單的文章,但沒(méi)來(lái)得及和大家分享使用的示例,下面這篇文章就來(lái)給大家分享下幾個(gè)使用的demo。
文中包括demo如下:
1. 同步加載子選項(xiàng)demo
2. 異步加載子選項(xiàng)demo
3. 初始值回填demo
4. 倒金字塔依賴demo
注意:在閱讀本文前請(qǐng)先移步上一篇文章:http://chabaoo.cn/article/78126.htm
1. 同步加載子選項(xiàng)
在各聯(lián)動(dòng)菜單加載之前,我們已經(jīng)通過(guò)某種方式(比如后端渲染、api依賴、deferred依賴等等)拿到了渲染各級(jí)菜單所需的各種數(shù)據(jù),我們只需要將該數(shù)據(jù)處理為
[{ text: 'some text', value: 'some value' },]
的形式,并封裝成數(shù)據(jù)源函數(shù)即可。以省-市聯(lián)動(dòng)為例:
html部分:
注意第二個(gè)select中聲明了dependents="province"
,以此實(shí)現(xiàn)聯(lián)動(dòng)
<select multi-level-select source="getProvinces" name="province" ng-model="form.province" empty="請(qǐng)選擇省份"></select> <select multi-level-select source="getCities" name="city" ng-model="form.city" empty="請(qǐng)選擇城市" dependents="province"></select>
controller部分:
預(yù)處理數(shù)據(jù),提供數(shù)據(jù)源函數(shù)
controller('myCtrl', ['$scope', function ($scope) { // angular使用好習(xí)慣,將primitive值放到對(duì)象上 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: '煙臺(tái)', 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é))外,完全一樣。
和上一個(gè)例子非常相似,只需要將兩個(gè)數(shù)據(jù)源函數(shù)修改為:
$scope.getProvinces = function () { return $q(function (resolve) { // 異步時(shí)應(yīng)返回promise,這里就不用http了,除了預(yù)處理(由使用者自己的業(yè)務(wù)邏輯負(fù)責(zé))外,完全一樣 // 如果需要緩存,也請(qǐng)?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)樵陂_(kāi)發(fā)初期這個(gè)需求就很明確了,所以使用上不需要做額外的工作,如果有初始值,只需要在controller中為其賦值即可:
// angular使用好習(xí)慣,將primitive值放到對(duì)象上 var form = {}; $scope.form = form; form.province = 30; form.city = 301;
4. 倒金子塔依賴
依賴聲明是通過(guò)由逗號(hào)分割的字符串的形式完成的,使用上非常方便。
設(shè)想以下的場(chǎng)景:
教務(wù)處需要學(xué)生對(duì)課程進(jìn)行評(píng)價(jià),學(xué)生先選擇周幾,再選擇時(shí)間,然后再選擇具體的課程下拉框
周幾和時(shí)間之間互不依賴,課程下拉框同時(shí)依賴于周幾和時(shí)間,換言之,一旦周幾和時(shí)間中的任意一個(gè)改變,課程下拉框就應(yīng)該更新。
html部分:
注意第三個(gè)select的dependents屬性是day,hour,即同時(shí)依賴于day和hour
<select multi-level-select source="getDays" name="day" ng-model="form.day" empty="請(qǐng)選擇周幾"></select> <select multi-level-select source="getHours" name="hour" ng-model="form.hour" empty="請(qǐng)選擇時(shí)間"></select> <select multi-level-select source="getCourses" name="course" ng-model="form.course" empty="請(qǐng)選擇課程" dependents="day,hour"></select>
controller部分:
和前面的例子類似,沒(méi)有什么特殊的,預(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: '聽(tīng)力', text: '聽(tīng)力' }], '2': [{ value: '數(shù)學(xué)', text: '數(shù)學(xué)' }] }, '星期三': { '1': [{ value: '計(jì)算機(jī)', text: '計(jì)算機(jī)' }], '2': [{ value: '游泳', text: '游泳' }, { value: '古漢語(yǔ)', text: '古漢語(yǔ)' }] }, }; $scope.getCourses = function (values) { if (!values.day || !values.hour) { return []; } return courses[values.day][values.hour]; }; });
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。
- AngularJS實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)(ztree)菜單示例代碼
- 實(shí)例詳解AngularJS實(shí)現(xiàn)無(wú)限級(jí)聯(lián)動(dòng)菜單
- AngularJS折疊菜單實(shí)現(xiàn)方法示例
- AngularJS實(shí)現(xiàn)的select二級(jí)聯(lián)動(dòng)下拉菜單功能示例
- Angular.js與Bootstrap相結(jié)合實(shí)現(xiàn)手風(fēng)琴菜單代碼
- AngularJS動(dòng)態(tài)菜單操作指令
- AngularJS+Bootstrap3多級(jí)導(dǎo)航菜單的實(shí)現(xiàn)代碼
- AngularJS模糊查詢功能實(shí)現(xiàn)代碼(過(guò)濾內(nèi)容下拉菜單排序過(guò)濾敏感字符驗(yàn)證判斷后添加表格信息)
- angularjs+bootstrap菜單的使用示例代碼
- Angluar+zorro實(shí)現(xiàn)無(wú)限級(jí)菜單
相關(guān)文章
angular.js和vue.js中實(shí)現(xiàn)函數(shù)去抖示例(debounce)
這篇文章主要介紹了angular.js和vue.js中實(shí)現(xiàn)函數(shù)去抖示例(debounce),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01詳解Angular項(xiàng)目中共享模塊的實(shí)現(xiàn)
本文主要介紹了Angular的共享模塊的實(shí)現(xiàn),對(duì)此感興趣的同學(xué),可以實(shí)驗(yàn)一下2021-05-05ionic4+angular7+cordova上傳圖片功能的實(shí)例代碼
ionic是一個(gè)垮平臺(tái)開(kāi)發(fā)框架,可通過(guò)web技術(shù)開(kāi)發(fā)出多平臺(tái)的應(yīng)用。這篇文章主要介紹了ionic4+angular7+cordova上傳圖片功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-06-06AngularJS2中一種button切換效果的實(shí)現(xiàn)方法(二)
這篇文章主要介紹了AngularJS2中一種button切換效果的實(shí)現(xiàn)方法(二),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Angular2里獲?。╥nput file)上傳文件的內(nèi)容的方法
這篇文章主要介紹了Angular2里獲?。╥nput file)上傳文件的內(nèi)容的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09