用AngularJS的指令实现tabs切换效果


Posted in Javascript onAugust 31, 2016

先来看看效果图

用AngularJS的指令实现tabs切换效果

首先先来说一下指令嵌套,指令嵌套顾名思义就是两个以上的指令嵌套在一起,比如下面这样:

<A-deirective>
  <B-directive></B-directive>
  <C-directive></C-directive>
</A-directive>

下面这个tabs功能的指令,刚好用到了这个,可以让代码更加简洁。

<!DOCTYPE html>
<html lang="en" ng-app="docsTabsExample">
<head>
 <meta charset="UTF-8">
 <title></title>
 <script></script>
 <script src="lib/angular.min.js" type="text/javascript"></script>
 <script src="lib/angular-route.js" type="text/javascript"></script>
 <script src="lib/jquery-2.1.4.min.js"></script>
 <script src="lib/bootstrap.js" type="text/javascript"></script>
 <link rel="stylesheet" href="css/bootstrap.css" type="text/css"/>
 <style>
 .active{
  background: red;
 }
 </style>
</head>
<body ng-controller="appCon">
 <my-tabs><!--最外层指令-->
 <my-pane tittle="ONE"><!--内层指令-->
  <h4>One</h4>
  <p>angularangularangularangularangularangularangular</p>
 </my-pane>
 <my-pane tittle="TWO"><!--内层指令-->
  <h4>Two</h4>
  <p>angularangularangularangularangularangularangular</p>
 </my-pane>
 <my-pane tittle="THERE"><!--内层指令-->
  <h4>There</h4>
  <p>bootstrapbootstrapbootstrapbootstrapbootstrapbootstrap</p>
 </my-pane>
 <my-pane tittle="FIVE"><!--内层指令-->
  <h4>five</h4>
  <p>jqueryjqueryjqueryjqueryjqueryjqueryjquery</p>
 </my-pane>
 </my-tabs>
</body>
<script>

 var app=angular.module("docsTabsExample",['template'])
   .controller("appCon",["$scope",function($scope){

   }])
   .directive("myTabs", function () {
    return{
    restrict:"EA",
    transclude: true,
    scope:{},
    templateUrl:"myTabs.html",
    controller:["$scope", function ($scope) {//使用controller让最内层指令来继承外层指令,这样内层就可以通过scope的传导,来与外层指令进行数据之间的传递
     var panes = $scope.scopes = [];//

     $scope.select= function (pane) {//实现tabs功能
     angular.forEach(panes, function (scope) { //遍历所有内存指令scope,统一隐藏内容。
      scope.selected=false;
     });
     pane.selected=true;//通过ng-repeat只
     };

     this.addScope= function (scope) {//由内层指令来继承,把内层指令的scope,传到进外层指令进行控制
     if(panes.length===0){
      $scope.select(scope);
     }
     panes.push(scope);//把内层指令数组,传入外层指令scope数组。
     }
    }]
    }
   })
   .directive("myPane", function () {
    return{
    restrict:'EA',
    scope:{
     tittle:'@'
    },
    transclude: true,
    require:'^myTabs',//继承外层指令
    templateUrl:"myPane.html",
    link: function (scope, elemenet,attrs,myTabsController) {
     myTabsController.addScope(scope);//把内层指令的scope存入到外层指令中,让外层遍历。
    }
    }
   });
 angular.module("template",[])
   .run(["$templateCache", function ($templateCache) {
    $templateCache.put("myTabs.html","<div class='table'>" +
      "<ul class='nav nav-tabs'>" +
      "<li ng-repeat='pane in scopes' ng-class='{active:pane.selected}'>" +
       "<a href='#' ng-click='select(pane)'>{{pane.tittle}}<a/>" +
      "</li>" +
      "</ul>" +
      "<div ng-transclude class='tab-content'></div>" +
      "</div>")
   }])
   .run(["$templateCache", function ($templateCache) {
    $templateCache.put("myPane.html","<div class='table-pane' ng-show='selected' ng-transclude>" +
      "</div>")
   }])

</script>
</html>

整个指令的的实现原理就是通过指令的继承,把内层指令的scope暴露到外层指令中,这样就可以在外层指令控制内层指令的显示。这里还有另外一个要说明的,为了让指令更加有层次,更加有逻辑性,使用了ng-transclude,让指令的template内容,反向插入到标有ng-transclude的内容中。

结束语

好了,以上就是AngularJS通过指令实现tabs切换功能的全部内容,大家都学会了吗?希望对大家学习AngularJS能有所帮助,如果有疑问可以留言交流。谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Open and Print a Word Document
Jun 15 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
Jul 11 Javascript
js中的数组Array定义与sort方法使用示例
Aug 29 Javascript
jQuery标签替换函数replaceWith()的使用例子
Aug 28 Javascript
JS创建对象的写法示例
Nov 04 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 Javascript
WebPack基础知识详解
Jan 16 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
Jul 03 Javascript
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
详解Vue CLI 3.0脚手架如何mock数据
Nov 23 Javascript
浅谈ng-zorro使用心得
Dec 03 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 #Javascript
AngularJS实现一次监听多个值发生的变化
Aug 31 #Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 #Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 #Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 #Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
Aug 31 #Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 #Javascript
You might like
php 读取shell管道传输过来的内容
2010/03/01 PHP
php array_intersect比array_diff快(附详细的使用说明)
2011/07/03 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PHP fopen函数用法实例讲解
2019/02/15 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
超全面的javascript中变量命名规则
2017/02/09 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
Vue精简版风格概述
2018/01/30 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python多线程经典问题之乘客做公交车算法实例
2017/03/22 Python
python 类详解及简单实例
2017/03/24 Python
浅析PEP572: 海象运算符
2019/10/15 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
python PIL模块的基本使用
2020/09/29 Python
python3 kubernetes api的使用示例
2021/01/12 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
电脑教师的教学自我评价
2013/11/26 职场文书
十佳党员事迹材料
2014/08/28 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
办护照工作证明
2014/10/01 职场文书
学校政风行风整改方案
2014/10/25 职场文书
教师节班会开场白
2015/06/01 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS