用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 相关文章推荐
从阿里妈妈发现的几个不错的表单验证函数
Sep 21 Javascript
JavaScript中String和StringBuffer的速度之争
Apr 01 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
May 27 Javascript
jQuery.each()用法分享
Jul 31 Javascript
vue.js初学入门教程(1)
Nov 03 Javascript
如何处理JSON中的特殊字符
Nov 30 Javascript
简单几步实现返回顶部效果
Dec 05 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
vue中的过滤器实例代码详解
Jun 06 Javascript
微信小程序实现页面分享onShareAppMessage
Aug 12 Javascript
解决vue项目获取dom元素宽高总是不准确问题
Jul 29 Javascript
nuxt 每个页面head标签内容设置方式
Nov 05 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的输入输出流
2007/02/14 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
php中JSON的使用与转换
2015/01/14 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
使用js解决由border属性引起的div宽度问题
2013/11/26 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
JS根据生日算年龄的方法
2015/05/05 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Python基本数据类型详细介绍
2014/03/11 Python
Python中列表和元组的相关语句和方法讲解
2015/08/20 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
小学生红领巾广播稿
2014/01/21 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
2014年大学生党课心得体会范文
2014/03/29 职场文书
一分钟演讲稿
2014/04/30 职场文书
企业培训简报范文
2015/07/20 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python