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 相关文章推荐
ext combox 下拉框不出现自动提示,自动选中的解决方法
Feb 24 Javascript
jquery下组织javascript代码(js函数化)
Aug 25 Javascript
jsonp原理及使用
Oct 28 Javascript
Jquery修改页面标题title其它JS失效的解决方法
Oct 31 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
Nov 24 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
May 12 Javascript
jQuery实现的瀑布流加载效果示例
Sep 13 Javascript
javascript中闭包概念与用法深入理解
Dec 15 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
Apr 17 Javascript
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
Vue-cli4 配置 element-ui 按需引入操作
Sep 11 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和ACCESS写聊天室(八)
2006/10/09 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
PHP线程的内存回收问题
2016/07/08 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
js正文内容高亮效果的实现方法
2013/06/30 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
python中的全局变量用法分析
2015/06/09 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Python进阶篇之字典操作总结
2016/11/16 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
PyTorch 普通卷积和空洞卷积实例
2020/01/07 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
python删除某个目录文件夹的方法
2020/05/26 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
法律系毕业生求职信
2014/05/28 职场文书
工作作风承诺书
2014/08/30 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL