我想用Angular创建一个Tab界面,我为选项卡选择了angular-ui-bootstrap
。我在里面TabController
创建了一个<tabset>
。我创建了一个TabService
作为标签的来源。
我在选项卡上创建了一个票据列表(这部分效果很好),我现在想通过单击列表中的项目来打开一个新选项卡。 Controller应该执行一些操作,然后使用
中的故障单详细信息视图创建一个新的TabTabService
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 () {
}
};
}]);
在标签中我编译了一些指令,例如物品清单。我现在希望能够在TabController上调用addTab
函数。我试图做require: '?^TabController'
,但它无法解析控制器。
我想当angular-ui创建一个孤立的范围时会出现一些问题,但也许我只是遗漏了一些东西。我刚开始使用指令,我想在指令中要求TabService,但是这会使我的TabController变得毫无用处,因为它不是TabService的责任。
答案 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