在此线程AngularJS UI router named views lazy loading之后,我希望有很多选项卡,每个选项卡都分配有自己的模板和控制器,如下所示:
angular.module('ppApp').config(function($stateProvider){
$stateProvider
.state('portfolio.patent', {
url: '/:patentId',
controller: 'mainItemCtrl',
templateUrl: 'app/templates/patent/main.main-item.tpl.htm'
}
})
angular.module('ppApp').controller('maintItemCtrl', function(){
var vm = this;
vm.leftTabs = {
'tab1': {
template: 'app/templates/child.sibling1.tpl.htm',
controller: 'siblingOneCtrl'
},
'tab2': {
template: 'app/templates/child.sibling2.tpl.htm',
controller: 'siblingTwoCtrl'
}
}
});
<uib-tabset active="active">
<uib-tab ng-repeat="(tabName,tab) in $ctrl.leftTabs" heading="{{tabName}}">
<div template={{tab.template}} controller="{{tab.controller}}">Loading {{tabName}} ...</div>
</uib-tab>
</uib-tabset>
我已经为兄弟控制器设置了控制器,并且它们已经起作用,直到尝试将它们动态加载到标签中。尽管未调用控制器,但模板已加载到视图中。如果我检查源代码,则控制器指令会将两个同级控制器都作为值。
问题
为什么我的控制器没有启动?
答案 0 :(得分:1)
我从来没有尝试过,但这很可能是因为表达式的内插太晚了,以至于无法访问并影响发生控制器构造和初始化的生命周期阶段。
至少,在指令控制器中,插值发生在$postLink
之后,这意味着到此为止,所有子代都已链接,并且在父代生命周期中太晚了,无法声明和实例化新的子代控制器
编辑: this is confirmed by the docs:
控制器构造函数。控制器在预链接阶段之前实例化,并且可以由其他指令访问(请参阅require属性)。