用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 相关文章推荐
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
Jun 16 Javascript
jQuery响应enter键的实现思路
Apr 18 Javascript
javascript的switch用法注意事项分析
Feb 02 Javascript
javaScript的函数对象的声明详解
Feb 06 Javascript
jquery插件Jplayer使用方法简析
Apr 22 Javascript
javascript执行环境及作用域详解
May 05 Javascript
JavaScript中的prototype原型学习指南
May 09 Javascript
AngularJS中的缓存使用
Jan 11 Javascript
老生常谈angularjs中的$state.go
Apr 24 Javascript
Webpack devServer中的 proxy 实现跨域的解决
Jun 15 Javascript
微信小程序授权登录及解密unionId出错的方法
Sep 26 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表单请求获得数据求和示例
2014/05/15 PHP
ThinkPHP自动填充实现无限级分类的方法
2014/08/22 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
2020/04/27 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
详解详解Python中writelines()方法的使用
2015/05/25 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python实现批量修改文件名实例
2015/07/08 Python
用Python设计一个经典小游戏
2017/05/15 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
自我鉴定范文200字
2013/10/02 职场文书
小学校园活动策划
2014/01/30 职场文书
入学生会自荐书范文
2014/02/05 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
房屋出租协议书
2014/04/10 职场文书
创建文明城市标语
2014/06/16 职场文书
文秘自荐信
2014/06/28 职场文书
心得体会的写法
2014/09/05 职场文书
优秀班主任材料
2014/12/16 职场文书
大学生自荐信范文
2015/03/05 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python