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 相关文章推荐
使用jQuery实现的掷色子游戏动画效果
Mar 14 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
Aug 11 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
推荐一个自己用的封装好的javascript插件
Jan 29 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
JavaScript必看小技巧(必看)
Jun 07 Javascript
webpack配置导致字体图标无法显示的解决方法
Mar 06 Javascript
详解React中setState回调函数
Jun 14 Javascript
详解适配器在JavaScript中的体现
Sep 28 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
微信小程序canvas绘制圆角base64图片的实现
Aug 18 Javascript
javascript+Canvas实现画板功能
Jun 23 Javascript
基于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
从wamp到xampp的升级之路
2015/04/08 PHP
php集成动态口令认证
2016/07/21 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
extjs 列表框(multiselect)的动态添加列表项的方法
2009/07/31 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
react实现菜单权限控制的方法
2017/12/11 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
在Mac OS上搭建Python的开发环境
2015/12/24 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
详解Python3 pandas.merge用法
2019/09/05 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
wxPython实现画图板
2020/08/27 Python
Python socket处理client连接过程解析
2020/03/18 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
菲律宾购物网站:Lazada菲律宾
2018/04/05 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
思想品德课教学反思
2014/02/10 职场文书
入党宣誓大会后的感想
2015/08/10 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
React 高阶组件HOC用法归纳
2021/06/13 Javascript
Python实现信息管理系统
2022/06/05 Python