angular复选框式js树形菜单(一)
treeView.html
<ul class="tree-view">
<li ng-repeat="item in treeData" ng-include="itemTemplateUrl||'/treeItem.html'" ></li>
</ul>
treeItem.html
<i ng-click="itemExpended(item, $event);" class="getItemIcon(item)"></i>
<input type="checkbox" ng-model="item.checked" class="check-box" ng-if="canChecked" ng-change="warpCallback('itemCheckedChanged', item, $event)">
<span class='text-field' ng-click="warpCallback('itemClicked', item, $event);">{{item.name}}</span>
<ul ng-if="!isLeaf(item)" ng-show="item.$$isExpend">
<li ng-repeat="item in item.childItems" ng-include="itemTemplateUrl||'/treeItem.html'">
</li>
</ul>
controller.html
<tree-view tree-data="vm.treeData" itemTemplateUrl="vm.itemTemplateUrl"
item-clicked="vm.itemClicked($item)"
item-checked-changed="vm.itemCheckedChanged($item)" can-checked="true">
</tree-view>
treeView.directive
angular.module('app', [])
.directive('treeView',[function(){
return {
restrict: 'E',
templateUrl: '/treeView.html',
scope: {
treeData: '=',
canChecked: '=',
textField: '@',
itemClicked: '&',
itemCheckedChanged: '&',
itemTemplateUrl: '@'
},
controller:['$scope', function($scope){
$scope.itemExpended = function(item, $event){
item.$$isExpend = ! item.$$isExpend;
$event.stopPropagation();
};
$scope.getItemIcon = function(item){
var isLeaf = $scope.isLeaf(item);
if(isLeaf){
return 'fa fa-leaf';
}
return item.$$isExpend ? 'fa fa-minus': 'fa fa-plus';
};
$scope.isLeaf = function(item){
return !item.children || !item.children.length;
};
$scope.warpCallback = function(callback, item, $event){
($scope[callback] || angular.noop)({
$item:item,
$event:$event
});
};
}]
};
}]);
treeView.controller
angular.module('app')
.controller('treeCtrl',function(){
var vm = this;
vm.treeData=[
{
id:"0010",
fatherId:"0000",
name:"流程管理",
checked:true,
childItems:[
{
id:"0020",
fatherId:"0010",
name:"个人任务池",
checked:true,
childItems:[
id:"0030",
fatherId:"0020",
name:"受理",
checked:true,
childItems:[]
]
},
{
id:"0021",
fatherId:"0010",
name:"公共任务池",
checked:false,
childItems:[]
}
]
},
{
id:"0100",
fatherId:"0000",
name:"信息查询",
checked:true,
childItems:[
{
id:"0120",
fatherId:"0100",
name:"计划信息",
checked:true,
childItems:[]
},
{
id:"0120",
fatherId:"0100",
name:"管理人信息",
checked:false,
childItems:[]
}
]
}
];
vm.itemCheckedChanged = function (changeItem) {
if (hasChildItems(changeItem)) {
setChildItems(changeItem);
}
setParentItems(changeItem);
};
function setChildItems(changeItem){
angular.forEach(changeItem.childItems,function(childItem){
changeItem.checked = changeItem.checked;
if(hasChildItems(childItem)){
setChildItems(childItem);
}
})
}
function setParentItems(changeItem){
definedParentItem(vm.treeData,changeItem);
}
function findParentItem(item,changeItem){
definedParentItem(item.childItems,changeItem);
}
function definedParentItem(childItems,changeItem){
var parentItem = _.find(childItems,{id:changeItem.fatherId});
if(!!parentItem){
parentItem.checked = isAllSelected(parentItem);
setParentItems(parentItem);
}else{
angular.forEach(childItems,function(childItem){
if(hasChildItems(childItem)){
findParentItem(childItem);
}
});
}
}
function isAllSelected(item){
var isSelected = [];
if(hasChildItems(item.childItems)){
angular.forEach(item.childItems,function(childItem){
isAllSelected.push(changeItem.checked);
});
}
return isSelected.indexOf(true)!==-1;
}
function hasChildItems(item){
return !!item.childItems && item.childItems.length>0;
}
});
angular复选框式js树形菜单(一)的更多相关文章
- angular复选框式js树形菜单(二)
删除(过滤)树形结构某一个子节点: function filterTreeData(treeData){ angular.forEach(treeData,function(item){ if (it ...
- DOM(十)使用DOM设置单选按钮、复选框、下拉菜单
1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...
- JQuery对单选框,复选框,下拉菜单的操作
JSP <%@ page language="java" import="java.util.*" pageEncoding="utf-8&qu ...
- 单选复选框的js代码取值
单选框 复选框选中后的js代码处理 <script type="text/javascript"> function check(){ document.getElem ...
- angular 复选框checkBox多选的应用
应用场景是这样的,后台返回的数据在页面上复选框的形式repeat出来 可能会有两种需求: 第一:后台返回的只有项,而没有默认选中状态(全是待选状态) 这种情况相对简单只要repeat出相应选项 第二: ...
- JS实现带复选框的下拉菜单
这段时间在做后台的时候需要一个可以复选的下拉菜单,用到的是easyUI中的combo的Demo,先看看官方easyUI:http://www.jeasyui.com/documentation/ind ...
- layui 单选框、复选框、下拉菜单 不显示问题 记录
1. 如果是 ajax嵌套了 页面, 请确保 只有最外层的页面引入了 layui.css 和 layui.js 内层页面 切记不要再次引入 2. layui.use(['form', 'upload ...
- jq获取单选框、复选框、下拉菜单的值
1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...
- JS树形菜单
超全的JS树形菜单源代码共享(有实例图) 树形菜单是很常用的效果,常用在管理软件当中,但是一套树形菜单已经不能满足需求,所以如果能有一套比较全面的树形菜单JS特效代码,将会非常方便,下面懒人萱将超全的 ...
随机推荐
- numpy的random模块详细解析
随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...
- C++语言的I/o使用方法详解
构造器 语法: fstream( const char *filename, openmode mode ); ifstream( const char *filename, openmode mod ...
- 06 Spring框架 依赖注入(三)多配置文件
在Spring前几节的学习中我们都使用了一个配置文件,就像struts2中可以包含其他的配置文件,我们能不能使用多个配置文件呢(在工程比庞大,配置比较多的时候)? Spring多配置文件分为两种: 平 ...
- 流量分析系统---kafka集群部署
1.集群部署的基本流程 Storm上游数据源之Kakfa 下载安装包.解压安装包.修改配置文件.分发安装包.启动集群 2.基础环境准备 安装前的准备工作(zk集群已经部署完毕) 关闭防火墙 chk ...
- yii2判断数据库字段is null
$query = new Query; $query->select('ID, City,State,StudentName') ->from('student') ->]) -&g ...
- Hibernate Student_Course_Score设计
示例: 设计代码,实现在数据库中建student表.course表.和score表,展现三者关系 student表:id.name course表:id.name score表:id.score.st ...
- STM32探秘 之FSMC
源:STM32探秘 之FSMC STM32 FSMC总线深入研究
- Mybatis细节问题
1.将字符串转换为日期格式? @DateTimeFormat(pattern="yyyy-MM-dd")
- Kafaka高可用集群环境搭建
zk集群环境搭建:https://www.cnblogs.com/toov5/p/9897868.html 三台主机每台的Java版本1.8 下面kafka集群的搭建: 3台虚拟机均进行以下操作: ...
- springboot---aop切片编程
1.介绍 面向切面编程,关注点代码与业务代码分离,就是给指定方法执行前执行后..插入重复代码 关注点:重复代码 切面:被切面的类 切入点:执行目标对象方法,动态植入切片代码 2.部署步骤 2.1:添加 ...