在子选项卡之间导航时,父控制器是否会再次重新初始化?

时间:2017-12-20 18:52:11

标签: javascript html angularjs

我有一个父控制器和两个标签,每个标签都有自己的控制器,如下图所示: 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'
      }
    }
  });

2 个答案:

答案 0 :(得分:0)

不,当更改子状态时,不会重新初始化父状态(以及控制器/组件)。这包括与父状态关联的任何resolve函数和状态事件处理程序。

Here's a Plunker that illustrates that the parent scope remains the same when you navigate between child states.

您可以通过将reload的{​​{1}}选项设置为$state.go(..)来强制重新加载父级。像这样:

true

答案 1 :(得分:0)

只要您不使用emit将更改推送到父控制器,父状态就会保持不变。

以下a c-sharpcorner link可能对您有所帮助!