从选项卡嵌套指令中访问Angular Controller

时间:2013-11-14 08:51:05

标签: angularjs angular-ui-bootstrap

我想用Angular创建一个Tab界面,我为选项卡选择了angular-ui-bootstrap。我在里面TabController创建了一个<tabset>。我创建了一个TabService作为标签的来源。

我在选项卡上创建了一个票据列表(这部分效果很好),我现在想通过单击列表中的项目来打开一个新选项卡。 Controller应该执行一些操作,然后使用

中的故障单详细信息视图创建一个新的Tab

TabService

angular.module('vendor.services').factory('TabService', [ '$q', function ($q) {
    'use strict';

    var tabs = [
        {
            title: "Tab Title",
            icon: "glyphicon-user",
            content: '<ticket-list></ticket-list>',
            closable: false
        }
    ];

    function getTabs() {
        var deferred = $q.defer();
        deferred.resolve(tabs);
        return deferred.promise;
    }

    function addTab(tab) {
        var deferred = $q.defer();
        tabs.push(tab);
        return deferred.promise;
    }

    return {
        getTabs : getTabs,
        addTab : addTab
    };

}]);

控制器

angular.module('vendor').controller('TabController', ['$scope', 'TabService', function ($scope, TabService) {
    'use strict';

    TabService.getTabs().then(function (tabs) {
        $scope.tabs = tabs;
    });

    $scope.addTab = function(type, index) {

        var tab = {
            title: "Tab Title",
            icon: "glyphicon-user",
            content: '<ticket>',
            closable: true
        };

        TabService.addTab(tab);
    };

}]);

模板(玉器)

.col-lg-12.tabs(ng-controller="TabController")
    tabset
        tab(ng-repeat="tab in tabs")
            tab-heading
                span.glyphicon(ng-class="tab.icon", ng-show="tab.icon")
                span(compile="tab.title")
                a(ng-click="removeTab($index)", href='', ng-show="tab.closable")
                    i.close &times;
            .tab-content(compile="tab.content")

指令

angular.module('vendor.directives').
    directive('ticketList',[ function () {
        'use strict';

        function ticketCtrl ($scope, TicketService) {

            TicketService.getTickets().then(function(tickets) {
                $scope.tickets = tickets;
            });

            $scope.openTicket = function(id) {
                $scope.addTab("ticket", id);
            };

        }

        return {

            restrict: 'E',

            controller: ['$scope', 'TicketService', function($scope, TicketService) {
                return ticketCtrl($scope, TicketService);
            }],

            templateUrl : "directives/ticketList.html",

            scope : {
                ngModel: '='
            },

            require: '?^TabController',

            link: function () {
            }
        };


    }]);

在标签中我编译了一些指令,例如物品清单。我现在希望能够在TabController上调用addTab函数。我试图做require: '?^TabController',但它无法解析控制器。

我想当angular-ui创建一个孤立的范围时会出现一些问题,但也许我只是遗漏了一些东西。我刚开始使用指令,我想在指令中要求TabService,但是这会使我的TabController变得毫无用处,因为它不是TabService的责任。

1 个答案:

答案 0 :(得分:1)

您可以使用控制器使TabController成为指令:

.directive('tabset', function() {
    return {
        controller: function() {}
    };
}

然后在ticketList中要求它并将其传递给链接函数

require: '^tabset',
link: function(scope, element, attrs, tabsetCtrl) {
    // you can use tabsetCtrl here
}

观看关于指令沟通的Egghead讲座http://egghead.io/lessons/angularjs-directive-communication