Angular directive递归实现目录树结构代码实例


Posted in Javascript onMay 05, 2017

整理文档,搜刮出一个Angular directive递归实现目录树结构代码实例代码,稍微整理精简一下做下分享。

效果图:

Angular directive递归实现目录树结构代码实例

重点:

1. 整棵目录树的实现,通过嵌套完成,主要在于对treeItem.html的递归使用

<script type="text/ng-template" id="treeView.html">

    <ul>

      <li ng-repeat="item in treeData.children" ng-include="'treeItem.html'"></li>

    </ul>

  </script>

  

  <script type="text/ng-template" id="treeItem.html">

    <span class="color-indictor" ng-class="{'leaf-node': isLeaf(item), 'expand-node': !isLeaf(item) && item.isExpand, 'unexpand-node': !isLeaf(item) && !item.isExpand}" ng-click="toggleExpandStatus(item)"></span>

    <span>{{item.name}}</span>

    <ul ng-if="!isLeaf(item)" ng-show="item.isExpand">

      <li ng-repeat="item in item.children" ng-include="'treeItem.html'"></li>

    </ul>

  </script>

2. 点击展开/关闭目录树

通过ng-show对item.expand进行判断,点击item时切换其expand参数,完成目录树的打开与关闭

3. 源码

<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.9/angular.js"></script>
<script>
angular.module("treeApp", [])
.controller("treeController", function($scope){
  $scope.jsonData = {
    name: 'menu',
    children: [{
      name: 'A',
      children: [{
        name: 'A.1',
        children: [{
          name: 'A.1.1',
          children: []
        }]
      },{
        name: 'A.2',
        children: [{
          name: 'A.2.1',
          children: [{
            name: 'A.2.1.1',
            children: []
          }]
        },{
          name: 'A.2.2',
          children: []
        }]
      }]
    },{
      name: 'B',
      children: [{
        name: 'B.1',
        children: []
      },{
        name: 'B.2',
        children: []
      }]
    },{
      name: 'C',
      children: []
    }]
  };
}).directive('treeView', function(){
  return {
    restrict: 'E',
    templateUrl: 'treeView.html',
    scope: {
      treeData: '='
    },
    controller: function($scope){
      $scope.isLeaf = function(item){
        return !item.children || !item.children.length;
      };
      $scope.toggleExpandStatus = function(item){
        item.isExpand = !item.isExpand;
      };
    }
  };
});
</script>
<style>
ul{
  list-style: none;
}
.color-indictor{
  display: inline-block;
  width: 20px;
  height: 20px;
  cursor: pointer;
}
.color-indictor.leaf-node{
  background: red;
}
.color-indictor.unexpand-node{
  background: green;
}
.color-indictor.expand-node{
  background-color: yellow;
}
</style>
<body ng-app="treeApp" ng-controller="treeController">
  <div>
  <p>Introduce: Click green block expand the menu tree</p>
  <p>Red: Leaf node, can not click</p>
  <p>Green: Unexpand node, click to expand menu</p>
  <p>Yellow: Expanded node, click to unexpand menu</p>
  </div>
  <tree-view tree-data="jsonData"></tree-view>
</body>

<script type="text/ng-template" id="treeView.html">
  <ul>
    <li ng-repeat="item in treeData.children" ng-include="'treeItem.html'"></li>
  </ul>
</script>
<script type="text/ng-template" id="treeItem.html">
  <span class="color-indictor" ng-class="{'leaf-node': isLeaf(item), 'expand-node': !isLeaf(item) && item.isExpand, 'unexpand-node': !isLeaf(item) && !item.isExpand}" ng-click="toggleExpandStatus(item)"></span>
  <span>{{item.name}}</span>
  <ul ng-if="!isLeaf(item)" ng-show="item.isExpand">
    <li ng-repeat="item in item.children" ng-include="'treeItem.html'"></li>
  </ul>
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript实现划词标记+划词搜索功能
Mar 06 Javascript
JavaScript对象和字串之间的转换实例探讨
Apr 21 Javascript
js单例模式详解实例
Nov 21 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
Feb 22 Javascript
详解node nvm进行node多版本管理
Oct 21 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
Feb 08 Javascript
浅谈vue首屏加载优化
Jun 28 Javascript
详解javascript appendChild()的完整功能
Aug 18 Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 jQuery
Vue render函数实战之实现tabs选项卡组件
Apr 22 Javascript
js变量值传到php过程详解 将php解析成数据
Jun 26 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 Javascript
微信小程序开发图片拖拽实例详解
May 05 #Javascript
javascript 中关于array的常用方法详解
May 05 #Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
May 05 #Javascript
Angular中实现树形结构视图实例代码
May 05 #Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 #Javascript
jquery中封装函数传递当前元素的方法示例
May 05 #jQuery
使用JS在浏览器中判断当前网络连接状态的几种方法
May 05 #Javascript
You might like
PHP开发入门教程之面向对象
2006/12/05 PHP
php strtotime 函数UNIX时间戳
2009/01/14 PHP
PHP实现把数字ID转字母ID
2013/08/12 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
python字典排序的方法
2019/10/12 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python3.8下载及安装步骤详解
2020/01/15 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
Django日志及中间件模块应用案例
2020/09/10 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
2021/01/06 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
C#笔试题
2015/07/14 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
求职信内容考虑哪几点
2013/10/05 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2015年建筑工程工作总结
2015/05/13 职场文书
中学教师教学工作总结
2015/08/13 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
Golang数据类型和相互转换
2022/04/12 Golang