我有一个父控制器和两个标签,每个标签都有自己的控制器,如下图所示: Parent and Child View Model
我正在使用$ rootScope从Tab1 / Tab2控制器广播一个事件,并使用$ scope捕获它的指令控制器范围。当我在选项卡之间切换时,父控制器和指令的控制器将再次初始化,并且在指令的控制器中捕获事件两次,即使它只被广播一次。 我试图调试并注意到该指令的控制器$ id被捕获时。当第一次捕获事件时,指令的id是使用上一个选项卡创建的id(我切换的选项卡)。第二次,指令的id是用当前标签创建的id(我切换到的标签)。
注意:1)即使在使用reload:false选项后,父控制器和指令控制器也会重新初始化。 2)我没有在html中使用ng-controller来初始化父控制器。它只能通过$ stateProvider路由进行初始化。
这是我配置状态的方式:
$stateProvider
.state('app.parent', {
url: 'parent/:paramId',
params: {
paramId: 'sample'
},
views: {
'content-parent@app': {
templateUrl: 'parent.html',
controller: 'ParentController',
resolve: {
defaultParams: function(parentService, $stateParams) {
return parentService.getDefaultParams($stateParams.paramId);
}
}
}
}
})
.state('app.parent.tab1', {
url: '/tab1/',
views: {
'content-child@app.parent': {
templateUrl: 'tab1.html',
controller: 'Tab1Controller'
}
}
})
.state('app.parent.tab2', {
url: '/tab2/',
views: {
'content-child@app.parent': {
templateUrl: 'tab2.html',
controller: 'Tab2Controller'
}
}
});
答案 0 :(得分:0)
不,当更改子状态时,不会重新初始化父状态(以及控制器/组件)。这包括与父状态关联的任何resolve
函数和状态事件处理程序。
您可以通过将reload
的{{1}}选项设置为$state.go(..)
来强制重新加载父级。像这样:
true
答案 1 :(得分:0)
只要您不使用emit将更改推送到父控制器,父状态就会保持不变。
以下a c-sharpcorner link可能对您有所帮助!