用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滚动条回到顶部的代码
Dec 06 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
Jul 03 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
Sep 06 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
Sep 08 Javascript
手把手搭建安装基于windows的Vue.js运行环境
Jun 12 Javascript
vue2中filter()的实现代码
Jul 09 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
Jan 08 jQuery
angularjs下ng-repeat点击元素改变样式的实现方法
Sep 12 Javascript
原生JS实现烟花效果
Mar 10 Javascript
小程序自定义弹框效果
Nov 16 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防注入安全代码
2008/04/09 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
php中JSON的使用与转换
2015/01/14 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
django model通过字典更新数据实例
2020/04/01 Python
完美解决jupyter由于无法import新包的问题
2020/05/26 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
css3绘制百度的小度熊
2018/10/29 HTML / CSS
日语系毕业生推荐信
2013/11/11 职场文书
竞聘副主任科员演讲稿
2014/01/11 职场文书
五一手机促销方案
2014/03/08 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
饭店服务员岗位职责
2015/02/09 职场文书
后勤工作个人总结
2015/02/28 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
python中如何对多变量连续赋值
2021/06/03 Python