Angular UI-Router - 刷新状态更改时延迟加载的嵌套ui-view

6
我刚开始使用ui-router,对于懒加载的嵌套ui-view有些困难。我尝试了很多方法,虽然我认为我已经接近成功了,但还是无法正常工作。因此,谁能修复下面分享的plunker,谁就可以获得正确答案。 Plunker 首先,require.js引导主应用程序,index.html包含两个ui-view,一个用于导航,另一个用于主内容区域。主内容区域包含各种投资组合项目(在plnkr中为Test1),当选择其中一个时,它们将被懒加载(使用ocLazyLoad)到主内容区域中。
主应用程序模块在其config方法中定义了各种状态,包括根据命名约定加载投资组合项的状态。

- 当点击Test1时,它的主模块会进行懒加载,并且该模块定义了自己的状态,而Test1则有自己的index.html和嵌套的ui-view。值得注意的是,我还必须使用该模块的run方法来运行一个函数,该函数将$state.go包装在$timeout中,以便在Test1初始点击时在嵌套的ui-view中显示模板内容。这是一种hackish的方式,毫无疑问不是正确的方法,也许是问题的根源,正如我们很快将看到的那样。我还尝试将$state.go放入服务中,但没有任何区别,因为最终遇到了相同的问题。

- 最后,这就是问题出现的地方。如果从Test1内部,您单击主导航中的Home,然后再次单击Test1,则先前出现在嵌套ui-view中的模板内容不会出现(显然,因为模块的run函数仅运行一次)。通过手动单击重新加载状态的链接可以轻松使其重新出现,但显然这并不理想。

TL/DR -- Home -> 单击Test1 -> 工作正常! -> 单击Home -> 单击Test1 -> 出现问题!

主应用程序模块和状态:

(function() {

  angular.module('myApp', [
  'ui.router',
  //'door3.css',
  'oc.lazyLoad'
])
.config(function($ocLazyLoadProvider, $stateProvider, $urlRouterProvider) {

  $urlRouterProvider.otherwise('/');

  $stateProvider
    .state('root', {
      url: '/',
      views: {
        'nav': {
          templateUrl: 'views/static/nav.html'
        },
        'content': {
          templateUrl: 'views/portfolio.html'
        }
      }
    })
    .state('root.home', {
      url: 'home',
      views: {
        'content@': {
          templateUrl: 'views/portfolio.html'
        }
      }
    })
    .state('root.about', {
      url: 'about',
      views: {
        'content@': {
          templateUrl: 'views/about.html'
        }
      }
    })
    .state('root.portfolio', {
      url: ':id',
      views: {
        'content@': {
          // css: function($stateParams) {
          //   return '/portfolio/' + $stateParams.id + '/css/master.css';
          // },
          templateUrl: function($stateParams) {
            return 'portfolio/' + $stateParams.id + '/index.html';
          },
          resolve: {
            load: function($stateParams, $ocLazyLoad) {
              return $ocLazyLoad.load({
                files: ['portfolio/' + $stateParams.id + '/js/mainModule.js']
              });
            }
          }
        }
      }
    });

});

})();

懒加载的Test1主模块和状态:

(function() {

  angular.module('testingApp', [{
  files: [
    'portfolio/testing/controllers/testingCtrl.js'
  ]
}])
.config(function($stateProvider, $urlRouterProvider) {

  $urlRouterProvider.otherwise('/');

  $stateProvider
    .state('root.portfolio.testing', {
      url: '/',
      views: {
        'testingContent@root.portfolio': {
          templateUrl: 'portfolio/testing/views/testfile.html',
          controller: 'testingCtrl',
          controllerAs: 'test'
        }
      }
    })
})
.run(function($state, $timeout) {
  $timeout(function() {
    $state.go('root.portfolio.testing');
  }, 0);
});

})();

我在UI-Router Extras中编写了Future States来管理大多数懒加载ui-router状态的陷阱:http://christopherthielen.github.io/ui-router-extras/#/future - Chris T
1个回答

1

我不确定您试图实现什么,但将$state.go放入run块是第一次和任何连续的时间都能工作的原因。

原因在于run块只在模块加载时运行一次,而模块只加载一次。

要修复此问题,请将$state.go调用移至testingCtrl,同时添加$state作为依赖注入。

请参见我修复后的plunker


这个代码按照预期工作,因此我会将其选为正确答案。但奇怪的是,在我更详细的项目版本中,它仍然没有解决我的问题,这让我感到困惑。我记得尝试过你提出的不同修复方案的变化,但要么根本不起作用,要么遇到无限循环问题。显然还有其他问题,如果我找出是什么问题后需要帮助,我会再次报告。 - winstonS
smh... 将嵌套的 index.html 文件中的 <body> 更改为 <div> 最终解决了问题。感谢您的帮助。 - winstonS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接