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 相关文章推荐
判断是否输入完毕再激活提交按钮
Jun 26 Javascript
面向对象的javascript(笔记)
Oct 06 Javascript
jquery 选择器引擎sizzle浅析
Feb 06 Javascript
js 连续赋值的简单实现
Jun 13 Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 Javascript
详解VUE的状态控制与延时加载刷新
Mar 27 Javascript
微信小程序实现长按删除图片的示例
May 18 Javascript
vue+高德地图写地图选址组件的方法
May 18 Javascript
微信小程序实现点击卡片 翻转效果
Sep 04 Javascript
基于js实现数组相邻元素上移下移
May 19 Javascript
JQuery基于FormData异步提交数据文件
Sep 01 jQuery
JavaScript 防盗链的原理以及破解方法
Dec 29 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
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
QueryPath PHP 中的jQuery
2010/04/11 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
php的zip解压缩类pclzip使用示例
2014/03/14 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
JavaScript高级程序设计
2006/12/29 Javascript
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
vue-router 中 meta的用法详解
2019/11/01 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
Python实现建立SSH连接的方法
2015/06/03 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
Python实现的生成格雷码功能示例
2018/01/24 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
高中军训感言200字
2014/02/23 职场文书
机械机修工岗位职责
2014/08/03 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
教师业务学习材料
2014/12/16 职场文书
优秀团员事迹材料
2014/12/25 职场文书
初三英语教学计划
2015/01/23 职场文书
汽车质检员岗位职责
2015/04/08 职场文书