【问题标题】:Does parent controller get re-initialized again while navigating between child tabs?在子选项卡之间导航时,父控制器是否会再次重新初始化?
【发布时间】:2017-12-20 18:52:11
【问题描述】:

我有一个父控制器和其中的两个选项卡,每个选项卡都有自己的控制器,如下图所示: Parent and Child View Model

我正在使用 $rootScope 从 Tab1/Tab2 控制器广播一个事件,并使用 $scope 捕获它指令的控制器范围。当我在选项卡之间切换时,父控制器和指令的控制器再次被初始化,并且事件在指令的控制器中被捕获两次,即使它只广播一次。 我尝试调试并注意到指令的控制器 $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'
      }
    }
  });

【问题讨论】:

  • 嗨,欢迎来到堆栈溢出。请参阅How to Ask 链接以获取有关如何提出问题并相应更新您的问题的更多详细信息。

标签: javascript html angularjs


【解决方案1】:

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

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

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

$state.go('parent.childA', null, { reload: true });

【讨论】:

  • 谢谢尼古拉!我注意到 reload 设置为 true 以切换选项卡。但即使在将其设置为 false 或删除重新加载选项之后,父控制器也会重新初始化。发生这种情况还有其他原因吗?
  • 你能分享你定义状态配置的代码吗?
  • 我在问题描述中提到了我的状态配置。
  • 您能提出一些解决方案吗?
  • 到目前为止,我找不到您分享的内容有什么特别错误的地方。尝试在 Plunker 或类似工具中重新创建问题,然后我会尝试一下。
【解决方案2】:

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

这里是a c-sharpcorner link,可能会对您有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2022-10-12
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多