原文地址:http://www.cnblogs.com/front-end-ralph/p/5133122.html

昨天没来得及贴几个使用demo,今天补上,供有兴趣的同学参考 :)

1. 同步加载子选项demo
2. 异步加载子选项demo
3. 初始值回填demo
4. 倒金字塔依赖demo

directive的源代码请移步上一个帖子:
http://www.cnblogs.com/front-end-ralph/p/5131687.html

1. 同步加载子选项
在各联动菜单加载之前,我们已经通过某种方式(比如后端渲染、api依赖、deferred依赖等等)拿到了渲染各级菜单所需的各种数据,我们只需要将该数据处理为
[{
text: 'some text',
value: 'some value'
},]
的形式,并封装成数据源函数即可。以省-市联动为例:
html部分:
注意第二个select中声明了dependents="province",以此实现联动

<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部分:
预处理数据,提供数据源函数

controller('myCtrl', ['$scope', function ($scope) {// angular使用好习惯,将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: '济南',id: 301}, {name: '青岛',id: 302}, {name: '烟台',id: 303}]}];var provinces = [];var citiesLookup = {};// 预处理,返回[{text: 'some text', value: 'some value'},]的数据格式$.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. 异步加载子选项demo
主要差异是数据源函数应该返回promise实例(AngularJS中使用$q即可)。为了演示方便,这里就不用$http了,除了预处理(由使用者自己的业务逻辑负责)外,完全一样。
和上一个例子非常相似,只需要将两个数据源函数修改为:

$scope.getProvinces = function () {return $q(function (resolve) {// 异步时应返回promise,这里就不用http了,除了预处理(由使用者自己的业务逻辑负责)外,完全一样// 如果需要缓存,也请在这里自己负责$timeout(function () {resolve(provinces);}, 100);});
};$scope.getCities = function (values) {return $q(function (resolve) {$timeout(function () {resolve(citiesLookup[values.province] || []);}, 100);});
};

3. 初始值回填
因为在开发初期这个需求就很明确了,所以使用上不需要做额外的工作,如果有初始值,只需要在controller中为其赋值即可:

// angular使用好习惯,将primitive值放到对象上
var form = {};
$scope.form = form;
form.province = 30;
form.city = 301;

4. 倒金子塔依赖
依赖声明是通过由逗号分割的字符串的形式完成的,使用上非常方便。
设想以下的场景:
教务处需要学生对课程进行评价,学生先选择周几,再选择时间,然后再选择具体的课程下拉框
周几和时间之间互不依赖,课程下拉框同时依赖于周几和时间,换言之,一旦周几和时间中的任意一个改变,课程下拉框就应该更新。
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部分:
和前面的例子类似,没有什么特殊的,预处理数据并提供数据源函数即可。

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: '数学',text: '数学'}, {value: '精读',text: '精读'}],'2': [{value: '足球',text: '足球'}]},'星期二': {'1': [{value: '听力',text: '听力'}],'2': [{value: '数学',text: '数学'}]},'星期三': {'1': [{value: '计算机',text: '计算机'}],'2': [{value: '游泳',text: '游泳'}, {value: '古汉语',text: '古汉语'}]},};$scope.getCourses = function (values) {if (!values.day || !values.hour) {return [];}return courses[values.day][values.hour];};
});

转载于:https://www.cnblogs.com/gongshunkai/p/7067802.html

AngularJS中实现无限级联动菜单(使用demo)相关推荐

  1. ASP+XML+JavaScript实现动态无限级联动菜单

    我做某个项目时,有需求的是做一个动态的无限级的联动菜单.由于本人比较懒于是上网找找有关的代码,但很多都没有满足需求,其中有一编文章是用JavaScript对XML文件操作来实现无限级联动菜单的,我们可 ...

  2. php创建无限级树型菜单以及三级联动菜单

    http://www.php.cn/php-weizijiaocheng-373500.html 这篇文章主要介绍了php创建无限级树型菜单 ,主要使用的是递归函数,感兴趣的小伙伴们可以参考一下 写递 ...

  3. 二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题

    二级联动 三级联动 多级联动 无限级联动下拉列表或菜单专题 三维数组数据源   A - 请选择 -北京市天津市河北省山西省内蒙古自治区辽宁省吉林省黑龙江省上海市江苏省浙江省安徽省福建省江西省山东省河南 ...

  4. phpcms v9中模板标签和联动菜单的使用方法详解

    2019独角兽企业重金招聘Python工程师标准>>> pc:content action="position" posid="9" orde ...

  5. 如果我有jQuery背景,那么“ AngularJS中的思考”吗? [关闭]

    已关闭 . 这个问题需要更加集中 . 它当前不接受答案. 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子来关注一个问题. 4年前关闭. 已锁定 . 该问题及其答案被锁定,因为该问题是题外话,但具有 ...

  6. angularjs 中的scope继承关系——(2)

    转自:http://www.lovelucy.info/understanding-scopes-in-angularjs.html angularjs 中的scope继承关系 ng-include ...

  7. php ajax实现的二级(多级)联动菜单(2008-10-21,11:36:08)

    首先看文件结构: /inc 包含function.php文件和数据操作类 /index.php html代码和州的收据获取代码 /ajax_city.php 城市数据的获取代码 /ajax.js ht ...

  8. PHP随机配菜_PHP+JS三级菜单联动菜单实现方法

    本文实例讲述了PHP+JS三级菜单联动菜单实现方法.分享给大家供大家参考,具体如下: 智能递归菜单-读取数据库 TD { FONT-FAMILY: "Verdana", " ...

  9. php mysql三级联动,PHP+mysql实现的三级联动菜单功能示例

    本文实例讲述了php+mysql实现的三级联动菜单功能.分享给大家供大家参考,具体如下: 数据库mysql -- 数据库: `student` -- -- ---------------------- ...

最新文章

  1. 简单综合部署nagios环境
  2. 群体运动度量--Measuring Crowd Collectiveness
  3. 资源论文非系统论文,NLP 圈同行评审存在的六大固化误区!
  4. HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)
  5. BZOJ4388 : JOI2012 invitation
  6. Python如何创建相同值的数组/列表
  7. php截取多个分割符号_PHP按符号截取字符串的指定部分的实现方法
  8. 如何在“活动监视器”中检查Mac是否需要更多内存?
  9. matlab图像融合代码,图像融合+源代码+matlab
  10. 黑马程序员-Java基础,Java集合Collection和Iterator接口
  11. 【3D相册】零基础完成3D相册并配上背景音乐
  12. 奈奎斯特稳定判据matlab处理,控制理论-奈奎斯特稳定判据学习笔记-综合电源技术-世纪电源网社区...
  13. Html5餐饮管理app,哗啦啦餐饮软件 餐饮管理系统
  14. 离线维基百科全书阅读器(wikireader)
  15. zabbix-server仪表板出现: 不
  16. lucky前面加a还是an_冠词a、an和the在用法上有什么不一样的地方
  17. django踩坑关于django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
  18. (FortiGate)飞塔防火墙产品参数
  19. ppt怎么把图片做成翻书效果_如何用PPT实现翻书效果?
  20. 谷歌公布云游戏平台「Stadia」 预计2019年上线

热门文章

  1. asp.net mvc Post上传文件大小限制 (转载)
  2. thinkphp-join
  3. 设计原则——依赖倒置
  4. Dominating Patterns
  5. android string.xml前后加空格的技巧
  6. Linux System and Performance Monitoring(Memory篇)
  7. 利用smarty生成静态页的关键代码
  8. js闭包循环原因_常见的三个 JS 面试题
  9. NetDevOps — YANG 协议
  10. SD-WAN — Overview