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 解决表单仍然提交即使监听处理函数返回false
Mar 14 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
JavaScript使用yield模拟多线程的方法
Mar 19 Javascript
jQuery学习笔记之入门
Dec 14 Javascript
简单实现Vue的observer和watcher
Dec 21 Javascript
TypeScript入门-基本数据类型
Mar 28 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
Apr 14 jQuery
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
Jul 25 jQuery
react实现移动端下拉菜单的示例代码
Jan 16 Javascript
vue-autoui自匹配webapi的UI控件的实现
Mar 20 Javascript
探索node之事件循环的实现
Oct 30 Javascript
微信小程序反编译的实现
Dec 10 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正则表达式(regar expression)
2011/09/10 PHP
用PHP写的基于Memcache的Queue实现代码
2011/11/27 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
什么情况下可以不写PHP的闭合标签“?&gt;”
2014/08/28 PHP
PHP实现的购物车类实例
2015/06/17 PHP
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
jQuery回调方法使用示例
2017/06/26 jQuery
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
AngularJS 实现购物车全选反选功能
2017/10/24 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
vue单文件组件lint error自动fix与styleLint报错自动fix详解
2019/01/08 Javascript
JS sort方法基于数组对象属性值排序
2020/07/10 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
python中随机函数random用法实例
2015/04/30 Python
Python制作简易注册登录系统
2016/12/15 Python
python 系统调用的实例详解
2017/07/11 Python
Python函数式编程
2017/07/20 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python 随机森林算法及其优化详解
2019/07/11 Python
解决Pycharm 导入其他文件夹源码的2种方法
2020/02/12 Python
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
四年级科学教学反思
2014/02/10 职场文书
房屋委托书范本
2014/04/04 职场文书
公司担保书格式范文
2014/05/12 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
寻找最美家庭活动方案
2014/08/20 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang