【发布时间】:2017-02-27 01:13:31
【问题描述】:
我目前正在编写一个标签导航示例来获得 Angular 的实践经验。此示例使用自定义指令和控制器继承。
Plunker 可以在here找到。
问题:一旦指令完成处理,我想选择一个默认选项卡来显示。但是在调用 myTabs 控制器的 selectTab 方法时(script.js $ctrl.selectTab(0) 中的第 41 行),Angular 还没有完成对 myTab 指令的处理(其中生成标签链接),所以tabs数组为空,选择失败。
我尝试立即使用 $timeout,但失败了。 $timeout 仅适用于设置 500 毫秒的延迟,这很 hacky。
是否有可用的事件或命令表明 Angular 结束处理某些指令,尤其是相互继承的指令?
我怀疑正在发生的事情:
myTabs 指令完成处理然后触发它的链接函数,但它在myTab 指令完成处理之前被触发。我不能将selectTab 方法调用放在myTab 链接函数中,因为会被多次调用(基于处理的标签数量。)希望我能清楚地解释这一点......我需要按摩
app.directive('myTabs', ['$timeout', function($timeout) {
return {
restrict: 'E',
transclude: true,
controllerAs: 'myTabsCtrl',
templateUrl: 'my-tabs.htm',
scope: {},
controller: function ($scope) {
vm = this;
this.tabs = [];
this.addTab = function (tab) {
this.tabs.push(tab);
};
this.selectTab = function selectTab (tabIndex) {
for (var i = 0; i < this.tabs.length; i++) {
this.tabs[i].selected = (i === tabIndex ? true : false);
}
};
},
link: function ($scope, $element, $attrs, $ctrl) {
$timeout(function () {
$ctrl.selectTab(0);
});
}
};
}]);
app.directive('myTab', function() {
return {
restrict: 'E',
require: '^^myTabs',
transclude: true,
templateUrl: 'my-tab.htm',
scope: {
title: '@'
},
link: function (scope, element, attrs, ctrl){
scope.tab = {
title: scope.title,
selected: false
};
ctrl.addTab(scope.tab);
}
};
});
【问题讨论】:
-
这似乎是根本原因:“对于每个指令,其控制器和预链接函数在其子指令的控制器和预链接函数之前执行”
-
它这样做是因为指令使用
templateURL异步获取模板。如果指令使用template,那就另当别论了..
标签: angularjs angular-directive