Angular.JS实现无限级的联动菜单(使用demo)


Posted in Javascript onFebruary 08, 2017

前言

之前给大家介绍过一篇关于AngularJS中实现无限级联动菜单的文章,但没来得及和大家分享使用的示例,下面这篇文章就来给大家分享下几个使用的demo。

文中包括demo如下:

1. 同步加载子选项demo

2. 异步加载子选项demo

3. 初始值回填demo

4. 倒金字塔依赖demo

注意:在阅读本文前请先移步上一篇文章:https://3water.com/article/78126.htm

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];
 };
});

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
现如今最流行的JavaScript代码规范
Mar 08 Javascript
jquery自定义下拉列表示例
Apr 25 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
JavaScript事件类型中UI事件详解
Jan 14 Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
微信小程序methods中定义的方法互相调用的实例代码
Aug 07 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
Jun 11 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
Oct 26 Javascript
vue基本使用--refs获取组件或元素的实例
Nov 07 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 #Javascript
jQuery实现级联下拉框实战(5)
Feb 08 #Javascript
webpack入门+react环境配置
Feb 08 #Javascript
JavaScript实现鼠标点击导航栏变色特效
Feb 08 #Javascript
jQuery实现优雅的弹窗效果(6)
Feb 08 #Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 #Javascript
深入理解js中的加载事件
Feb 08 #Javascript
You might like
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
fleaphp常用方法分页之Pager使用方法
2011/04/23 PHP
php Session存储到Redis的方法
2013/11/04 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
JS+html5制作简单音乐播放器
2020/09/13 Javascript
JS触摸事件、手势事件详解
2017/05/04 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
three.js实现圆柱体
2018/12/30 Javascript
js实现碰撞检测
2021/01/29 Javascript
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
python海龟绘图实例教程
2014/07/24 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
2014政务公开实施方案
2014/02/19 职场文书
小学生环保倡议书
2014/05/15 职场文书
土建工程师岗位职责
2014/06/10 职场文书
全陪导游词
2015/02/04 职场文书
小平您好观后感
2015/06/09 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python