多个嵌套状态 AngularJS ui-router
Multiple nested states AngularJS ui-router
如果这是一个愚蠢的问题,请原谅,但我是 AngularJS 的新手,对于我的生活,我无法弄清楚为什么这个嵌套视图设置没有按预期运行。
我有一个顶级<div>
:
<div class="grid" ui-view></div>
其中有一个模块填充其视图:
angular.module('planttheidea',[
'ui.router',
'planttheidea.header',
'planttheidea.mainContent',
'planttheidea.footer'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider,$urlRouterProvider){
$stateProvider
.state('base',{
url:'',
views:{
'':{
templateUrl:'app/layout.view.html',
controller:'LayoutCtrl'
}
}
});
$urlRouterProvider.otherwise('/');
}])
.controller('LayoutCtrl',function LayoutCtrl($scope,$stateParams){
var layout = this;
});
然后我有了那个布局视图的内容:
<header ui-view="header" class="header menubar col-p-100" ng-controller="HeaderCtrl"></header>
<main ui-view="main-content" class="main-content grid col-p-100" ng-controller="MainContentCtrl"></main>
<footer ui-view="footer" class="footer col-p-100" ng-controller="FooterCtrl"></footer>
现在我有了带有自己模块的页眉和页脚:
angular.module('planttheidea.header',[
'planttheidea.header.menu'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.header',{
url:'',
views:{
'header@base':{
templateUrl:'app/components/header/header.view.html',
controller:'HeaderCtrl as layoutHeaderCtrl'
}
}
});
}])
.controller('HeaderCtrl',function HeaderCtrl($scope,$stateParams){
var layoutHeaderCtrl = this;
});
angular.module('planttheidea.footer',[])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.footer',{
url:'',
views:{
'footer@base':{
templateUrl:'app/components/footer/footer.view.html',
controller:'FooterCtrl as layoutFooterCtrl'
}
}
});
}])
.controller('FooterCtrl',function FooterCtrl($scope,$stateParams){
var layoutFooterCtrl = this;
});
你可以看到它们几乎是一样的。页眉模块运行良好(它甚至有自己的嵌套 ui-菜单视图,工作正常),但是页脚代码未路由 ui-视图。更奇怪的是,如果我将页脚代码复制并粘贴到页眉模块中(仅使用 base.header
状态),它会按预期工作:
angular.module('planttheidea.header',[
'planttheidea.header.menu'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.header',{
url:'',
views:{
'header@base':{
templateUrl:'app/components/header/header.view.html',
controller:'HeaderCtrl as layoutHeaderCtrl'
},
'footer@base':{
templateUrl:'app/components/footer/footer.view.html',
controller:'FooterCtrl as layoutFooterCtrl'
}
}
});
}])
.controller('HeaderCtrl',function HeaderCtrl($scope,$stateParams){
var layoutHeaderCtrl = this;
})
.controller('FooterCtrl',function FooterCtrl($scope,$stateParams){
var layoutFooterCtrl = this;
});
我已经验证了代码是否被正确加载(我在页脚的控制器中做了一个 console.log()
只是为了确保它是 运行),所以我认为它必须被隔离成两个模块。我是否需要在同一状态下声明所有布局视图,或者是否有办法像我在此处所做的那样将它们分解为单独的模块?我必须相信这是可能的,因为我是使用嵌套菜单模块这样做的,但是它是嵌套的,而页脚是平行的,所以我担心这可能是问题所在。
任何帮助将不胜感激,但请记住我正在学习 AngularJS,因此虽然工作代码会很棒(显然),但解释为什么会更棒.
所以这里有一些问题,我会先更正一下,看看是否能解决您的问题。
假设您有这样的 DOM 布局:
<div ui-view>
<div ui-view="view1"></div>
</div>
然后你的路线看起来像这样(即使它被分成不同的模块,只要你将其他模块注入主模块 - 你就是)
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base',{
url:'/',
templateUrl:'template.html',
controller:'Ctrl as ctrl'
})
.state('base.view1',{
url:'/view1',
views:{
'view1':{
templateUrl:'template.html',
controller:'Ctrl2 as ctrl2'
}
}
});
}])
一些注意事项:
因为我的 base
状态直接进入一个没有值的 ui-view 我没有空字符串的视图对象,我只是完全排除它。
我的 base.view1
也分配了一个 url,因为它是不同的状态。
因为我的 ui-view="view1"
在我的 base
状态的 ui 视图中,我不需要声明该视图,因为下面的 view1@base
是一个场景我需要这样做。
<div ui-view="main"></div>
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base',{
url:'/',
views : {
'main' : {
templateUrl:'template.html',
controller:'Ctrl as ctrl'
}
}
})
.state('base.view1',{
url:'/view1',
views : {
'main@base' : {
templateUrl:'template.html',
controller:'Ctrl as ctrl'
}
}
});
}])
在这个例子中,我希望 base.view1
到 "takeover",也就是说,base
所在的视图。
我不太明白为什么页眉和页脚的状态不同。也许这是因为我没有你项目的大局,但它似乎不正常。通常您会将页眉和页脚作为父状态的一部分,然后让您的主要内容区域切换为不同的嵌套状态。
希望这是有道理的,如果我能澄清更多,请告诉我。
如果这是一个愚蠢的问题,请原谅,但我是 AngularJS 的新手,对于我的生活,我无法弄清楚为什么这个嵌套视图设置没有按预期运行。
我有一个顶级<div>
:
<div class="grid" ui-view></div>
其中有一个模块填充其视图:
angular.module('planttheidea',[
'ui.router',
'planttheidea.header',
'planttheidea.mainContent',
'planttheidea.footer'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider,$urlRouterProvider){
$stateProvider
.state('base',{
url:'',
views:{
'':{
templateUrl:'app/layout.view.html',
controller:'LayoutCtrl'
}
}
});
$urlRouterProvider.otherwise('/');
}])
.controller('LayoutCtrl',function LayoutCtrl($scope,$stateParams){
var layout = this;
});
然后我有了那个布局视图的内容:
<header ui-view="header" class="header menubar col-p-100" ng-controller="HeaderCtrl"></header>
<main ui-view="main-content" class="main-content grid col-p-100" ng-controller="MainContentCtrl"></main>
<footer ui-view="footer" class="footer col-p-100" ng-controller="FooterCtrl"></footer>
现在我有了带有自己模块的页眉和页脚:
angular.module('planttheidea.header',[
'planttheidea.header.menu'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.header',{
url:'',
views:{
'header@base':{
templateUrl:'app/components/header/header.view.html',
controller:'HeaderCtrl as layoutHeaderCtrl'
}
}
});
}])
.controller('HeaderCtrl',function HeaderCtrl($scope,$stateParams){
var layoutHeaderCtrl = this;
});
angular.module('planttheidea.footer',[])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.footer',{
url:'',
views:{
'footer@base':{
templateUrl:'app/components/footer/footer.view.html',
controller:'FooterCtrl as layoutFooterCtrl'
}
}
});
}])
.controller('FooterCtrl',function FooterCtrl($scope,$stateParams){
var layoutFooterCtrl = this;
});
你可以看到它们几乎是一样的。页眉模块运行良好(它甚至有自己的嵌套 ui-菜单视图,工作正常),但是页脚代码未路由 ui-视图。更奇怪的是,如果我将页脚代码复制并粘贴到页眉模块中(仅使用 base.header
状态),它会按预期工作:
angular.module('planttheidea.header',[
'planttheidea.header.menu'
])
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base.header',{
url:'',
views:{
'header@base':{
templateUrl:'app/components/header/header.view.html',
controller:'HeaderCtrl as layoutHeaderCtrl'
},
'footer@base':{
templateUrl:'app/components/footer/footer.view.html',
controller:'FooterCtrl as layoutFooterCtrl'
}
}
});
}])
.controller('HeaderCtrl',function HeaderCtrl($scope,$stateParams){
var layoutHeaderCtrl = this;
})
.controller('FooterCtrl',function FooterCtrl($scope,$stateParams){
var layoutFooterCtrl = this;
});
我已经验证了代码是否被正确加载(我在页脚的控制器中做了一个 console.log()
只是为了确保它是 运行),所以我认为它必须被隔离成两个模块。我是否需要在同一状态下声明所有布局视图,或者是否有办法像我在此处所做的那样将它们分解为单独的模块?我必须相信这是可能的,因为我是使用嵌套菜单模块这样做的,但是它是嵌套的,而页脚是平行的,所以我担心这可能是问题所在。
任何帮助将不胜感激,但请记住我正在学习 AngularJS,因此虽然工作代码会很棒(显然),但解释为什么会更棒.
所以这里有一些问题,我会先更正一下,看看是否能解决您的问题。
假设您有这样的 DOM 布局:
<div ui-view>
<div ui-view="view1"></div>
</div>
然后你的路线看起来像这样(即使它被分成不同的模块,只要你将其他模块注入主模块 - 你就是)
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base',{
url:'/',
templateUrl:'template.html',
controller:'Ctrl as ctrl'
})
.state('base.view1',{
url:'/view1',
views:{
'view1':{
templateUrl:'template.html',
controller:'Ctrl2 as ctrl2'
}
}
});
}])
一些注意事项:
因为我的 base
状态直接进入一个没有值的 ui-view 我没有空字符串的视图对象,我只是完全排除它。
我的 base.view1
也分配了一个 url,因为它是不同的状态。
因为我的 ui-view="view1"
在我的 base
状态的 ui 视图中,我不需要声明该视图,因为下面的 view1@base
是一个场景我需要这样做。
<div ui-view="main"></div>
.config(['$stateProvider','$urlRouterProvider',function($stateProvider){
$stateProvider
.state('base',{
url:'/',
views : {
'main' : {
templateUrl:'template.html',
controller:'Ctrl as ctrl'
}
}
})
.state('base.view1',{
url:'/view1',
views : {
'main@base' : {
templateUrl:'template.html',
controller:'Ctrl as ctrl'
}
}
});
}])
在这个例子中,我希望 base.view1
到 "takeover",也就是说,base
所在的视图。
我不太明白为什么页眉和页脚的状态不同。也许这是因为我没有你项目的大局,但它似乎不正常。通常您会将页眉和页脚作为父状态的一部分,然后让您的主要内容区域切换为不同的嵌套状态。
希望这是有道理的,如果我能澄清更多,请告诉我。