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的常规数组和关联数组对比小结
May 24 Javascript
Javascript动态创建div的方法
Feb 09 Javascript
Javascript 基础---Ajax入门必看
Jul 06 Javascript
AngularJS基础 ng-class-odd 指令示例
Aug 01 Javascript
浅谈jquery高级方法描述与应用
Oct 04 Javascript
AngularJS学习第一篇 AngularJS基础知识
Feb 13 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
Jun 29 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
Sep 14 Javascript
简单谈谈js的数据类型
Sep 25 Javascript
JS Ajax请求会话过期处理问题解决方法分析
Nov 16 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
Feb 15 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
Dec 30 Vue.js
基于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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
php实现对象克隆的方法
2015/06/20 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
原生js和jquery分别实现横向导航菜单效果
2016/05/13 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
python实现计算倒数的方法
2015/07/11 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
浅谈dataframe中更改列属性的方法
2018/07/10 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
python读取mysql数据绘制条形图
2020/03/25 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
积极分子思想汇报
2014/01/04 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
2014年共青团工作总结
2014/12/10 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
行政主管岗位职责范本
2015/04/09 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书