Javascript 角度UI路由器-在状态更改时刷新延迟加载的嵌套UI视图
我刚开始使用ui路由器,在使用惰性加载的嵌套ui视图时遇到了一些困难。我已经尝试了很多方法,虽然我想我已经接近了,但我还是不能让它发挥作用,所以无论是谁修复了下面共享的plunker,都会得到正确的答案 -首先,require.js引导主应用程序,index.html包含两个ui视图,一个用于导航,一个用于主内容部分。主内容部分包含各种公文包项(plnkr中的Test1),当选择一个公文包项时,这些公文包项被延迟加载(使用ocLazyLoad)到主内容部分 -主应用程序模块在其配置方法中定义了各种状态,包括根据其ID和命名约定加载公文包项的状态 -单击Test1时,它的主模块是延迟加载的,该模块定义自己的状态,Test1有自己的index.html和自己的嵌套ui视图。值得注意的是,我还必须使用这个模块的run方法来运行一个包装$state.go in$timeout的函数,以便在最初单击Test1时,在嵌套的ui视图中显示模板内容。这是一种骇人听闻的做法,毫无疑问不是正确的方法,也许是问题的根源,我们很快就会看到。我还尝试将$state.go放入一个服务中,但没有起到任何作用,因为我最终遇到了相同的问题 -最后,这里是事情的转折点。如果从Test1内部,您在主导航中单击Home,然后再次尝试单击Test1,则之前出现在嵌套ui视图中的模板内容不会出现(显然,因为模块的run函数只运行一次)。通过手动单击重新加载状态的链接可以很容易地使其重新出现,但显然这是不可取的 TL/DR--主页->点击测试1->工作!->单击主页->单击测试1->中断 主应用程序模块和状态:Javascript 角度UI路由器-在状态更改时刷新延迟加载的嵌套UI视图,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我刚开始使用ui路由器,在使用惰性加载的嵌套ui视图时遇到了一些困难。我已经尝试了很多方法,虽然我想我已经接近了,但我还是不能让它发挥作用,所以无论是谁修复了下面共享的plunker,都会得到正确的答案 -首先,require.js引导主应用程序,index.html包含两个ui视图,一个用于导航,一个用于主内容部分。主内容部分包含各种公文包项(plnkr中的Test1),当选择一个公文包项时,这些公文包项被延迟加载(使用ocLazyLoad)到主内容部分 -主应用程序模块在其配置方法中定义了
(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']
});
}
}
}
}
});
});
})();
(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);
});
})();
延迟加载的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']
});
}
}
}
}
});
});
})();
(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);
});
})();
我不确定您试图实现什么,但将
$state.go
放入run
块是它第一次和任何其他连续时间工作的原因
原因是run
块在模块加载时仅运行一次,模块仅加载一次
要修复此移动$state。在添加$state
作为依赖项注入时,转到调用testingCtrl
请参阅我的修复。这是它应该工作的,因此我将奖励它正确的答案。奇怪的是,在我的项目中,它仍然没有解决我的问题,这让我感到困惑。我记得,我尝试过您建议的修复的不同变体,它要么根本不起作用,要么遇到无限循环问题。显然还有别的地方出了问题,我会在弄清楚是什么问题后,如果我需要帮助,我会报告的。。。将更改为嵌套index.html文件中的是最终修复它的方法。感谢您的帮助。我在UI路由器附加程序中编写了未来状态,以管理延迟加载UI路由器状态的大多数陷阱: