为了账号安全,请及时绑定邮箱和手机立即绑定

AngularJS通过指令实现tabs切换功能

标签:
AngularJS

最近在和同学忙一个创业的项目,博客更新的不是很多,今天下午刚好下雨,就写一个通过指令嵌套实现tabs功能的指令模块,这也是我在一个项目中应用到的。<p>


   442  jdfw.gif

首先先来说一下指令嵌套,指令嵌套顾名思义就是两个以上的指令嵌套在一起,比如下面这样:

<A-deirective>       <B-directive></B-directive>       <C-directive></C-directive> </A-directive>

下面这个tabs功能的指令,刚好用到了这个,可以让代码更加简洁。</br>

<!DOCTYPE html> <html ng-app="docsTabsExample"> <head>   <meta charset="UTF-8">   <title></title>   <script></script>   <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="lib/angular.min.js" type="text/javascript"></script>   <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="lib/angular-route.js" type="text/javascript"></script>   <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="lib/jquery-2.1.4.min.js"></script>   <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="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暴露到外层指令中,这样就可以在外层指令控制内层指令的显示。这里还有另外一个要说明的,为了让指令更加有层次,更加有逻辑性,使用了<code>ng-transclude</code>,让指令的template内容,反向插入到标有<code>ng-transclude</code>的内容中。



作者:MakingChoice
链接:https://www.jianshu.com/p/d90d058ec28b


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消