angularJS1笔记-(15)-自定义指令(accordion伸缩菜单原始实现)

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../../vendor/bootstrap3/css/bootstrap.min.css"/>
</head>
<body>
<div ng-app="myApp">
    <!--container为居中的div-->
    <div class="container">
        <div ng-controller="firstController">
            <kittencup-group>
                <kittencup-collapse ng-repeat="collapse in data" heading="{{collapse.title}}">
                    {{collapse.content}}
                </kittencup-collapse>
            </kittencup-group>
        </div>
    </div>
</div>

<script type="text/javascript" src="../../vendor/angular/angularJs.js"></script>
<script type="text/javascript" src="app/index.js"></script>

<script>
</script>

</body>
</html>

  kittencupCollapse.html

<div class="panel panel-default">
    <div class="panel-heading" ng-click="changeStatus()">
        <h4 class="panel-title">
            <a href="#">
                {{heading}}
            </a>
        </h4>
    </div>
    <!--collapse为true 才会隐藏子内容-->
    <div class="panel-collapse" ng-class="{collapse:!isOpen}">
        <div class="panel-body" ng-transclude>
        </div>
    </div>
</div>

  index.js:

var myApp = angular.module('myApp', [])
//数据
    .factory('myData', function () {
        return [
            {title: "no1", content: "no1-content1"},
            {title: "no2", content: "no2-content2"},
            {title: "no3", content: "no3-content3"}
        ];
    })
    //控制器
    .controller('firstController', ['$scope', 'myData', function ($scope, myData) {//把myData注入进来
        $scope.data = myData;
    }])
    .directive('kittencupGroup', function () {
        return {
            restrict: 'E',
            replace: true,
            template: '<div class="panel-group" ng-transclude></div>',//此处为kittencup-group标签里面的内容占位成一个panel-group
            transclude: true,
            controllerAs: 'kittencuupGroupController',
            controller: function () {
                this.groups = [];
                //关闭其他的
                this.closeOtehrCollapse = function (nowScope) {
                    angular.forEach(this.groups, function (scope) {
                        if (scope != nowScope) {
                            scope.isOpen = false;
                        }
                    })
                }
            }
        }
    })
    .directive('kittencupCollapse', function () {
        return {
            restrict: 'E',
            replace: true,
            require: '^kittencupGroup',
            templateUrl: 'temp/kittencupCollapse.html',
            scope: {
                heading: "@"
            },
            //link可以把其他的controller依赖注入进来
            link: function (scope, element, attrs, kittencuupGroupController) {
                scope.isOpen = false;
                scope.changeStatus = function () {
                    scope.isOpen = !scope.isOpen;
                    kittencuupGroupController.closeOtehrCollapse(scope);
                }
                kittencuupGroupController.groups.push(scope);
            },
            transclude: true  //将模板的内容放在指定的ng-transclude属性的标签里面去
        }
    })

  运行结果:

原文地址:https://www.cnblogs.com/yk123/p/6887115.html