Я хочу создать интерфейс вкладок с помощью Angular, и я выбрал angular-ui-bootstrap
для вкладок. Я упаковал TabController
с <tabset>
внутри. Я создал 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 ×
.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 () {
}
};
}]);
На вкладках я компилирую некоторые директивы, например. список предметов. Теперь я хочу иметь возможность вызывать функцию addTab
в TabController. Я пытался сделать require: '?^TabController'
, но он не может разрешить контроллер.
Я предполагаю, что есть некоторая проблема, когда angular-ui создает изолированную область, но, возможно, я просто что-то упускаю. Я только начал использовать директивы, я думал о том, чтобы потребовать TabService внутри директивы, но это сделало бы мой TabController бесполезным, поскольку TabService не несет ответственности за это.