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 isArray()函数判断对象类型的种种方法
Oct 11 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 Javascript
EasyUI 中 MenuButton 的使用方法
Jul 14 Javascript
基于jQuery中对数组进行操作的方法
Apr 16 Javascript
js创建对象的方式总结
Jan 10 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
Aug 03 Javascript
JS动态添加iframe的代码
Sep 14 Javascript
Bootstrap菜单按钮及导航实例解析
Sep 09 Javascript
关于Vue.nextTick()的正确使用方法浅析
Aug 25 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
JS实现轮播图效果
Jan 11 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
模仿OSO的论坛(三)
2006/10/09 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php实现通过ftp上传文件
2015/06/19 PHP
CodeIgniter配置之database.php用法实例分析
2016/01/20 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php接口技术实例详解
2016/12/07 PHP
php实现登录页面的简单实例
2019/09/29 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
js 全兼容可高亮二级缓冲折叠菜单
2010/06/04 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
js简单时间比较的方法
2016/08/02 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
python的常见命令注入威胁
2013/02/18 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
python实现黑客字幕雨效果
2018/06/21 Python
python爬取指定微信公众号文章
2018/12/20 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
python中的句柄操作的方法示例
2019/06/20 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python netmiko模块的使用
2020/02/14 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
创业计划实施的7大步骤
2014/02/05 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
人与自然观后感
2015/06/16 职场文书
付款证明模板
2015/06/19 职场文书