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 相关文章推荐
利用404错误页面实现UrlRewrite的实现代码
Aug 20 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
Jul 20 Javascript
Jquery实现的角色左右选择特效
May 21 Javascript
js初始化验证实例详解
Nov 26 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
Jun 14 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
使用async-validator编写Form组件的方法
Jan 10 Javascript
微信小程序自定义组件之可清除的input组件
Jul 17 Javascript
vue cli 3.0 搭建项目的图文教程
May 17 Javascript
jQuery实现高级检索功能
May 28 jQuery
JS函数本身的作用域实例分析
Mar 16 Javascript
js面试题之异步问题的深入理解
Sep 20 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
全国FM电台频率大全 - 30 宁夏回族自治区
2020/03/11 无线电
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP使用preg_split()分割特殊字符(元字符等)的方法分析
2017/02/04 PHP
破解Session cookie的方法
2006/07/28 Javascript
nicejforms——美化表单不用愁
2007/02/20 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
DOM 事件流详解
2015/01/20 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
[45:14]Optic vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
浅谈对yield的初步理解
2017/05/29 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
文秘自荐信
2013/10/20 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python