Angular.JS实现无限级的联动菜单(使用demo)
前言
之前给大家介绍过一篇关于AngularJS中实现无限级联动菜单的文章,但没来得及和大家分享使用的示例,下面这篇文章就来给大家分享下几个使用的demo。
文中包括demo如下:
1.同步加载子选项demo
2.异步加载子选项demo
3.初始值回填demo
4.倒金字塔依赖demo
注意:在阅读本文前请先移步上一篇文章:https://www.nhooo.com/article/78126.htm
1.同步加载子选项
在各联动菜单加载之前,我们已经通过某种方式(比如后端渲染、api依赖、deferred依赖等等)拿到了渲染各级菜单所需的各种数据,我们只需要将该数据处理为
[{
text:'sometext',
value:'somevalue'
},]
的形式,并封装成数据源函数即可。以省-市联动为例:
html部分:
注意第二个select中声明了dependents="province",以此实现联动
<selectmulti-level-selectsource="getProvinces"name="province"ng-model="form.province"empty="请选择省份"></select> <selectmulti-level-selectsource="getCities"name="city"ng-model="form.city"empty="请选择城市"dependents="province"></select>
controller部分:
预处理数据,提供数据源函数
controller('myCtrl',['$scope',function($scope){
//angular使用好习惯,将primitive值放到对象上
varform={};
$scope.form=form;
vardata=[{
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
}]
}];
varprovinces=[];
varcitiesLookup={};
//预处理,返回[{text:'sometext',value:'somevalue'},]的数据格式
$.each(data,function(index,province){
provinces.push({
text:province.name,
value:province.id
});
varcities=[];
$.each(province.cities,function(index,city){
cities.push({
text:city.name,
value:city.id
});
});
citiesLookup[province.id]=cities;
});
$scope.getProvinces=function(){
returnprovinces;
};
$scope.getCities=function(values){
returncitiesLookup[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值放到对象上
varform={};
$scope.form=form;
form.province=30;
form.city=301;
4.倒金子塔依赖
依赖声明是通过由逗号分割的字符串的形式完成的,使用上非常方便。
设想以下的场景:
教务处需要学生对课程进行评价,学生先选择周几,再选择时间,然后再选择具体的课程下拉框
周几和时间之间互不依赖,课程下拉框同时依赖于周几和时间,换言之,一旦周几和时间中的任意一个改变,课程下拉框就应该更新。
html部分:
注意第三个select的dependents属性是day,hour,即同时依赖于day和hour
<selectmulti-level-selectsource="getDays"name="day"ng-model="form.day"empty="请选择周几"></select> <selectmulti-level-selectsource="getHours"name="hour"ng-model="form.hour"empty="请选择时间"></select> <selectmulti-level-selectsource="getCourses"name="course"ng-model="form.course"empty="请选择课程"dependents="day,hour"></select>
controller部分:
和前面的例子类似,没有什么特殊的,预处理数据并提供数据源函数即可。
controller('myCtrl',function($scope){
varform={};
$scope.form=form;
$scope.getDays=function(){
vardays='一二三'.split('');
days.forEach(function(item,index){
days[index]={
text:'星期'+item,
value:'星期'+item
};
});
returndays;
};
$scope.getHours=function(){
return[{
text:'09:00-12:00',
value:'1'
},{
text:'14:00-17:00',
value:'2'
}];
};
varcourses={
'星期一':{
'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[];
}
returncourses[values.day][values.hour];
};
});
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。