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 冒号 使用说明
Jun 06 Javascript
Javascript中对象继承的实现小例
May 12 Javascript
jQuery操作select下拉框的text值和value值的方法
May 31 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
使用正则表达式的格式化与高亮显示json字符串
Dec 03 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
BootStrap注意事项小结(五)表单
Mar 10 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
Nov 08 Javascript
element-ui中el-upload多文件一次性上传的实现
Dec 02 Javascript
vue实现登录、注册、退出、跳转等功能
Dec 23 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 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
PHP生成静态页面详解
2006/12/05 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
Angular 应用技巧总结
2016/09/14 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
python随机生成指定长度密码的方法
2015/04/04 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
如何用Matplotlib 画三维图的示例代码
2020/07/28 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
大学生职业生涯规划书模板
2014/01/03 职场文书
致标枪运动员加油稿
2014/02/15 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
营销与策划实训报告
2014/11/05 职场文书
销售助理岗位职责
2015/02/11 职场文书
忠诚教育学习心得体会
2016/01/23 职场文书