用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 相关文章推荐
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
jquery tab插件精简版分享
Sep 10 Javascript
javascript获取select值的方法分析
Jul 02 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
Oct 26 Javascript
Vue2实现组件props双向绑定
Dec 02 Javascript
JS实现微信摇一摇原理解析
Jul 22 Javascript
vue获取dom元素注意事项
Dec 28 Javascript
用p5.js制作烟花特效的示例代码
Mar 21 Javascript
当vue路由变化时,改变导航栏的样式方法
Aug 22 Javascript
每个 JavaScript 工程师都应懂的33个概念
Oct 22 Javascript
layui实现form表单同时提交数据和文件的代码
Oct 25 Javascript
JavaScript利用html5新方法操作元素类名详解
Nov 27 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP7常量数组用法分析
2016/09/26 PHP
使用laravel根据用户类型来显示或隐藏字段
2019/10/17 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
求解开jscript.encode代码的asp函数
2007/02/28 Javascript
关于this和self的使用说明
2010/08/01 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
js的2种继承方式详解
2014/03/04 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
js中setTimeout()与clearTimeout()用法实例浅析
2015/05/12 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
angular.js实现购物车功能
2017/10/23 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python面向对象进阶学习
2019/05/21 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python如何转换字符串大小写
2020/06/04 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
软件设计的目标是什么
2016/12/04 面试题
人民教师求职自荐信
2014/03/12 职场文书
信息技术国培研修日志
2015/11/13 职场文书
Python开发简易五子棋小游戏
2022/05/02 Python
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python