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 相关文章推荐
浅谈jQuery异步对象(XMLHttpRequest)
Nov 17 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
vue制作加载更多功能的正确打开方式
Oct 12 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
Sep 28 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
详解ESLint在Vue中的使用小结
Oct 15 Javascript
Vue动画事件详解及过渡动画实例
Feb 09 Javascript
基于three.js实现的3D粒子动效实例代码
Apr 09 Javascript
优雅地使用loading(推荐)
Apr 20 Javascript
ES6中new Function()语法及应用实例分析
Feb 19 Javascript
Javascript confirm多种使用方法解析
Sep 25 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实现微信公众平台音乐点播
2014/03/20 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
按下回车键指向下一个位置的一个函数代码
2014/03/10 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
Python +Selenium解决图片验证码登录或注册问题(推荐)
2020/02/09 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
市级文明单位申报材料
2014/05/07 职场文书
公司员工离职证明书
2014/10/04 职场文书
小学教师师德培训心得体会
2016/01/09 职场文书
Python快速优雅的批量修改Word文档样式
2021/05/20 Python
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python
Mysql 一主多从的部署
2022/05/20 MySQL