用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 相关文章推荐
JavaScript回调(callback)函数概念自我理解及示例
Jul 04 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
js 右侧浮动层效果实现代码(跟随滚动)
Nov 22 Javascript
AngularJS入门教程之链接与图片模板详解
Aug 19 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
Sep 05 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
详解angularJS自定义指令间的相互交互
Jul 05 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
vue项目中使用tinymce编辑器的步骤详解
Sep 11 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
Nov 08 Javascript
Vue中keep-alive 实现后退不刷新并保持滚动位置
Mar 17 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 jQuery
简洁实用的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中关于socket的系列函数总结
2015/05/18 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
javascript使用Blob对象实现的下载文件操作示例
2020/04/18 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
python 多线程串行和并行的实例
2019/02/22 Python
Python实现FM算法解析
2019/06/18 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
Linux如何压缩可执行文件
2014/03/27 面试题
成考报名单位证明范本
2014/01/16 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
生产助理岗位职责
2014/06/18 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python