AngularJS递归指令实现Tree View效果示例


Posted in Javascript onNovember 07, 2016

本文实例讲述了AngularJS递归指令实现Tree View效果的方法。分享给大家供大家参考,具体如下:

在层次数据结构展示中,树是一种极其常见的展现方式。比如系统中目录结构、企业组织结构、电子商务产品分类都是常见的树形结构数据。

这里我们采用Angular的方式来实现这类常见的tree view结构。

首先我们定义数据结构,采用以children属性来挂接子节点方式来展现树层次结构,示例如下:

[
  {
   "id":"1",
   "pid":"0",
   "name":"家用电器",
   "children":[
     {
      "id":"4",
      "pid":"1",
      "name":"大家电"
     }
   ]
  },
  {
   ...
  }
  ...
]

则我们对于ng way的tree view可以实现为:

JavaScript:

angular.module('ng.demo', [])
.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
         });
       };
     }]
   };
 }]);

HTML:

树内容主题HTML: /treeView.html

<ul class="tree-view">
    <li ng-repeat="item in treeData" ng-include="'/treeItem.html'" ></li>
</ul>

每个item节点的HTML:/treeItem.html

<i ng-click="itemExpended(item, $event);" class=""></i>
<input type="checkbox" ng-model="item.$$isChecked" class="check-box" ng-if="canChecked" ng-change="warpCallback('itemCheckedChanged', item, $event)">
<span class='text-field' ng-click="warpCallback('itemClicked', item, $event);"></span>
<ul ng-if="!isLeaf(item)" ng-show="item.$$isExpend">
  <li ng-repeat="item in item.children" ng-include="'/treeItem.html'">
  </li>
</ul>

这里的技巧在于利用ng-include来加载子节点和数据,以及利用一个warpCallback方法来转接函数外部回调函数,利用angular.noop的空对象模式来避免未注册的回调场景。对于View交互的数据隔离采用了直接封装在元数据对象的方式,但它们都以$$开头,如$$isChecked、$$isExpend。在Angular程序中以$$开头的对象会被认为是内部的私有变量,在angular.toJson的时候,它们并不会被序列化,所以利用$http发回服务端更新的时候,它们并不会影响服务端传送的数据。同时,在客户端,我们也能利用对象的这些$$属性来控制View的状态,如item.$$isChecked来默认选中某一节点。

我们就可以如下方式来使用这个tree-view:

<tree-view tree-data="demo.tree" text-field="name" value-field='id' item-clicked="demo.itemClicked($item)" item-checked-changed="demo.itemCheckedChanged($item)" can-checked="true"></tree-view>

效果如下:

AngularJS递归指令实现Tree View效果示例

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
Javascript中With语句用法实例
May 14 Javascript
JavaScript中的slice()方法使用详解
Jun 06 Javascript
JS生成某个范围的随机数【四种情况详解】
Apr 20 Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 Javascript
JavaScript中利用构造器函数模拟类的方法
Feb 16 Javascript
VueJS如何引入css或者less文件的一些坑
Apr 25 Javascript
vue移动端使用canvas签名的实现
Jan 15 Javascript
如何使用Jquery动态生成二级选项列表
Feb 06 jQuery
JS实现进度条动态加载特效
Mar 25 Javascript
jQuery实现简单日历效果
Jul 05 jQuery
jQuery 动态粒子效果示例代码
Jul 07 jQuery
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
基于Bootstrap仿淘宝分页控件实现代码
Nov 07 #Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 #Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
Nov 07 #Javascript
AngularJS实现Input格式化的方法
Nov 07 #Javascript
AngularJS自定义插件实现网站用户引导功能示例
Nov 07 #Javascript
webpack常用配置项配置文件介绍
Nov 07 #Javascript
jQuery Mobile和HTML5开发App推广注册页
Nov 07 #Javascript
You might like
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
PHP简单遍历对象示例
2016/09/28 PHP
基于php编程规范(详解)
2017/08/17 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
php扩展开发入门demo示例
2019/09/23 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
2013/04/17 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
jquery实现加载等待效果示例
2013/09/25 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
详解Angular Karma测试的持续集成实践
2019/11/15 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
Python文件读取的3种方法及路径转义
2015/06/21 Python
python的keyword模块用法实例分析
2015/06/30 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
python3爬虫中引用Queue的实例讲解
2020/11/24 Python
入党介绍人评语
2014/05/06 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
小学教师读书活动总结
2014/07/08 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
小学老师对学生的评语
2014/12/29 职场文书
2015年教务工作总结
2015/05/23 职场文书
单独二胎证明
2015/06/24 职场文书
仓库管理制度范本
2015/08/04 职场文书