0

Angular でタブ インターフェイスを作成したいので、タブを選択angular-ui-bootstrapしました。中を木枠にTabControllerしました<tabset>TabServiceタブのソースとしてを作成しました。

チケットのリストを含むタブを作成します(この部分はうまく機能します)。リスト内のアイテムをクリックして新しいタブを開きたいと思います。コントローラーは何らかの処理を行ってから、内部にチケットの詳細ビューを含む新しいタブを作成する必要があります

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 () {
            }
        };


    }]);

タブ内で、アイテムのリストなど、いくつかのディレクティブをコンパイルします。addTabTabControllerで関数を呼び出せるようにしたいと考えています。やろうとしましrequire: '?^TabController'たが、コントローラーを解決できません。

angular-ui が分離されたスコープを作成するときに問題があると思いますが、何かが足りないだけかもしれません。ディレクティブの使用を開始したばかりで、ディレクティブ内で TabService を要求することを考えましたが、TabService の責任ではないため、TabController が役に立たなくなります。

4

1 に答える 1

1

コントローラーを使用して TabController をディレクティブにすることができます。

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

そして、チケットリストでそれを要求し、リンク関数に渡します

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

指令通信に関する Egghead の講義を見るhttp://egghead.io/lessons/angularjs-directive-communication

于 2013-11-14T10:40:13.487 に答える