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 类
Nov 07 Javascript
用javascript实现的激活输入框后隐藏初始内容
Jun 29 Javascript
Javascript实现快速排序(Quicksort)的算法详解
Sep 06 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
Dec 08 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
vue的注意规范之v-if 与 v-for 一起使用教程
Aug 04 Javascript
vue移动端模态框(可传参)的实现
Nov 20 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
Preload基础使用方法详解
Feb 03 Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 Javascript
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
微信小程序开发图片拖拽实例详解
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
搜索引擎技术核心揭密
2006/10/09 PHP
PHP学习之PHP变量
2006/10/09 PHP
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
php常用字符函数实例小结
2016/12/29 PHP
php微信开发之关注事件
2018/06/14 PHP
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
vue实现文件上传功能
2018/08/13 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
python使用Matplotlib画条形图
2020/03/25 Python
python中的数据结构比较
2019/05/13 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
考试不及格的检讨书
2014/01/22 职场文书
简历自我评价模版
2014/01/31 职场文书
公司活动方案范文
2014/03/06 职场文书
销售竞赛活动方案
2014/08/23 职场文书
2015年度个人业务工作总结
2015/04/27 职场文书
医院志愿者活动总结
2015/05/06 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
Javascript webpack动态import
2022/04/19 Javascript
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers