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树形菜单(一)的更多相关文章

  1. angular复选框式js树形菜单(二)

    删除(过滤)树形结构某一个子节点: function filterTreeData(treeData){ angular.forEach(treeData,function(item){ if (it ...

  2. DOM(十)使用DOM设置单选按钮、复选框、下拉菜单

    1.设置单选按钮 单选按钮在表单中即<input type="radio" />它是一组供用户选择的对象,但每次只能选一个.每一个都有checked属性,当一项选择为t ...

  3. JQuery对单选框,复选框,下拉菜单的操作

    JSP <%@ page language="java" import="java.util.*" pageEncoding="utf-8&qu ...

  4. 单选复选框的js代码取值

    单选框 复选框选中后的js代码处理 <script type="text/javascript"> function check(){ document.getElem ...

  5. angular 复选框checkBox多选的应用

    应用场景是这样的,后台返回的数据在页面上复选框的形式repeat出来 可能会有两种需求: 第一:后台返回的只有项,而没有默认选中状态(全是待选状态) 这种情况相对简单只要repeat出相应选项 第二: ...

  6. JS实现带复选框的下拉菜单

    这段时间在做后台的时候需要一个可以复选的下拉菜单,用到的是easyUI中的combo的Demo,先看看官方easyUI:http://www.jeasyui.com/documentation/ind ...

  7. layui 单选框、复选框、下拉菜单 不显示问题 记录

    1. 如果是 ajax嵌套了 页面, 请确保  只有最外层的页面引入了 layui.css 和 layui.js 内层页面 切记不要再次引入 2. layui.use(['form', 'upload ...

  8. jq获取单选框、复选框、下拉菜单的值

    1.<input type="radio" name="testradio" value="jquery获取radio的值" /> ...

  9. JS树形菜单

    超全的JS树形菜单源代码共享(有实例图) 树形菜单是很常用的效果,常用在管理软件当中,但是一套树形菜单已经不能满足需求,所以如果能有一套比较全面的树形菜单JS特效代码,将会非常方便,下面懒人萱将超全的 ...

随机推荐

  1. numpy的random模块详细解析

    随机抽样 (numpy.random) 简单的随机数据 rand(d0, d1, ..., dn) 随机值 >>> np.random.rand(3,2) array([[ 0.14 ...

  2. C++语言的I/o使用方法详解

    构造器 语法: fstream( const char *filename, openmode mode ); ifstream( const char *filename, openmode mod ...

  3. 06 Spring框架 依赖注入(三)多配置文件

    在Spring前几节的学习中我们都使用了一个配置文件,就像struts2中可以包含其他的配置文件,我们能不能使用多个配置文件呢(在工程比庞大,配置比较多的时候)? Spring多配置文件分为两种: 平 ...

  4. 流量分析系统---kafka集群部署

    1.集群部署的基本流程 Storm上游数据源之Kakfa 下载安装包.解压安装包.修改配置文件.分发安装包.启动集群 2.基础环境准备 安装前的准备工作(zk集群已经部署完毕)  关闭防火墙 chk ...

  5. yii2判断数据库字段is null

    $query = new Query; $query->select('ID, City,State,StudentName') ->from('student') ->]) -&g ...

  6. Hibernate Student_Course_Score设计

    示例: 设计代码,实现在数据库中建student表.course表.和score表,展现三者关系 student表:id.name course表:id.name score表:id.score.st ...

  7. STM32探秘 之FSMC

    源:STM32探秘 之FSMC STM32 FSMC总线深入研究

  8. Mybatis细节问题

    1.将字符串转换为日期格式? @DateTimeFormat(pattern="yyyy-MM-dd")

  9. Kafaka高可用集群环境搭建

    zk集群环境搭建:https://www.cnblogs.com/toov5/p/9897868.html 三台主机每台的Java版本1.8 下面kafka集群的搭建:  3台虚拟机均进行以下操作:  ...

  10. springboot---aop切片编程

    1.介绍 面向切面编程,关注点代码与业务代码分离,就是给指定方法执行前执行后..插入重复代码 关注点:重复代码 切面:被切面的类 切入点:执行目标对象方法,动态植入切片代码 2.部署步骤 2.1:添加 ...