利用angularJS directive编写自定义指令accordion 案例

<!DOCTYPE html>
<html lang="en" ng-app="expanderModule">
<head>
    <meta charset="UTF-8">
    <title>自定义指令 accordion</title>
    <link rel="stylesheet" href="CSS/bootstrap.css">

    <style>
        .accordion{
            border:solid 1px #E3E3E3;
            width: 200px;
            margin-top: 20px;
            margin-left: 20px;
        }
        .expander{
            width: 100%;

        }
        .title{
            background-color: #2f96b4;
        }
        .body{
            background-color: #ffffff;
            height:100px;
        }

    </style>
    <script src="angular.min.js"></script>
    <script>
        var expModule = angular.module('expanderModule',[]);
        //accordion通过Controller暴露一部分公共的方法
        expModule.directive('accordion',function(){
            return{
                restrict: 'EA',
                replace: true,
                transclude: true,
                template: '<div class="accordion" ng-transclude></div>',
                controller:function () {
                    var expanders = [];
                    this.gotOpened = function (selectedExpander) {
                        angular.forEach(expanders,function (expander) {
                            if(selectedExpander != expander){
                                expander.showMe = false;
                            }
                        })
                    }
                    this.addExpander = function (expander) {
                        expanders.push(expander);
                    }
                }
            }
        })
        expModule.directive('expander',function () {
            return{
                restrict: 'EA',
                replace : true,
                transclude: true,
                require:'^?accordion',  //依赖外部的accodion,在link 中就可以接受第四个参数accordionController
                scope : {
                    title:'=expanderTitle'
                },
                template : '<div><div class="title" ng-click="toggle()">{{title}}</div>' +
                '<div class="body" ng-show="showMe" ng-transclude></div>' +
                '</div>',
                link : function (scope,element,attrs,accordionController) {
                    scope.showMe  = false;
                    accordionController.addExpander(scope);
                    scope.toggle = function toggle() {
                        scope.showMe = !scope.showMe;
                        accordionController.gotOpened(scope);
                    }
                }
            }
        });
        expModule.controller('SomeController',function ($scope) {
            $scope.expanders = [{
                title:'Click me to expand',
                text : "hello,I am the content that was hidden but now is shown."
            },{
                title:"Click this",
                text:"I am even better text that you have seen previously"
            },{
                title:"Test",
                text:"test"
            }]
        })
    </script>
</head>
<body ng-controller="SomeController">
    <accordion >
        <expander class="expander" ng-repeat="expander in expanders" expander-title="expander.title">
            {{expander.text}}
        </expander>
    </accordion>

</body>
</html>

界面如下图所示:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值