用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 相关文章推荐
ajaxControlToolkit AutoCompleteExtender的用法
Oct 30 Javascript
JQuery 获得绝对,相对位置的坐标方法
Feb 09 Javascript
用JS动态改变表单form里的action值属性的两种方法
May 25 Javascript
bootstrap模态框垂直居中效果
Dec 03 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
Mar 27 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
EasyUI 数据表格datagrid列自适应内容宽度的实现
Jul 18 Javascript
js中关于Blob对象的介绍与使用
Nov 29 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
Jul 22 Javascript
JS+css3实现幻灯片轮播图
Aug 14 Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 Javascript
JavaScript实现alert弹框效果
Nov 19 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单例模式实现(对象只被创建一次)
2012/12/05 PHP
PHP生成树的方法
2015/07/28 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
jquery插件之easing 动态菜单
2010/08/21 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
python发送邮件功能实现代码
2016/07/15 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
在python中画正态分布图像的实例
2019/07/08 Python
Python 使用 environs 库定义环境变量的方法
2020/02/25 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
Django+Uwsgi+Nginx如何实现生产环境部署
2020/07/31 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
C# Debug和Testing相关面试题
2015/10/25 面试题
应用外语系自荐信
2014/06/26 职场文书
文员岗位职责
2015/02/04 职场文书
心术观后感
2015/06/11 职场文书
圣诞晚会主持词
2015/07/01 职场文书
我爱我班主题班会
2015/08/13 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书