此问题基于"How can I persist sibling ui-views when changing state"(plunker)。
当我在主导航(mainNav)中更改状态时,我尝试保持视图(内容)不变。
内容应仅由子导航设置,并在更改主导航时保留。
是否有可能在ui-router中保留一个视图,即使该状态还剩下?
angular.module('MyApp', [
'ui.router'
])
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/');
$stateProvider
.state('index', {
url: '/',
views: {
'@': {
templateUrl: 'layout.html'
},
'mainNav@index': {
template: '<a ui-sref="Main3">Main3 - with sub</a><br />'
+ '<a ui-sref="Main4">Main4 - with sub</a>'
},
'subNav@index' : {
template: '<p>This is the sub navigation</p>'
},
'content@index': {
template: '<p>Content shared for MAINs</p>'
}
}
})
.state('Main3', {
parent: 'index',
url: '/Main3',
views: {
/*'mainNav': {
},*/
'subNav': {
template: '<a ui-sref="Main3.Sub1">Main3.Sub1</a><br />'
+ '<a ui-sref="Main3.Sub2">Main3.Sub2</a>'
}
}
})
.state('Main4', {
parent: 'index',
url: '/Main4',
views: {
'subNav': {
template: '<a ui-sref="Main4.Sub1">Main4.Sub1</a><br />'
+ '<a ui-sref="Main4.Sub2">Main4.Sub2</a>'
}
}
})
.state('Main3.Sub1', {
url: '/Sub1',
views: { 'content@index': { template: 'Content of Main3.Sub1' } }
})
.state('Main3.Sub2', {
url: '/Sub2',
views: { 'content@index': { template: 'Content of Main3.Sub2' } }
})
.state('Main4.Sub1', {
url: '/Sub1',
views: { 'content@index': { template: 'Content of Main4.Sub1' } }
})
.state('Main4.Sub2', {
url: '/Sub2',
views: { 'content@index': { template: 'Content of Main4.Sub2' } }
})
});
我找到了Persist state when changing to another state,但它并没有完全解决问题。状态是持久的,但是在导航到不同的状态时没有考虑保持视图一致。
答案 0 :(得分:1)
是的,这很容易,但它有其局限性:将您需要的数据存储在父母的范围内。
$state.state('parent', {
controller:'ParentController'
});
$state.state('parent.child1', {
controller:'ChildController'
});
$state.state('parent.child2', {
controller:'ChildController2'
});
// in Parent controller
$scope.context = {};// it important to create a intermediary field that will store the data, otherwise you might have a problem with scopes inheritance
// in Child controller
$scope.context.toto = 'titi';
//在其他子控制器中 $ scope.context.toto ='woof';
注意:如果您使用controllerAs语法,我不知道这是否有效。
我个人将它用于包含下一个/后退按钮的多页表单。
答案 1 :(得分:1)
Walfrat的回答似乎是对的。我只想详细说明,也许了解你正在寻找的东西。这就是我认为您的要求:
// app.js
...
$stateProvider
.state('nav', {
url: '/',
templateUrl: 'app/templates/nav.html',
controller: 'NavCtrl as nav',
abstract: true
})
.state('nav.subNav', {
url: 'subNav/',
templateUrl: 'app/templates/subNav.html',
controller: 'subNavCtrl as subNav',
abstract: true
})
.state('nav.subNav.index', {
url: 'index',
templateUrl: 'app/templates/index.html',
controller: 'IndexCtrl as index'
});
$urlRouterProvider.otherwise('/subNav/index');
...
在此示例中,您可以通过在导航状态中包含abstract: true
来设置默认视图(注意:我从未尝试过三种状态,但它适用于两种状态)。这可能会给你你想要的效果。
至于将子导航作为视图,它应该是可能的,但我不确定是否建议使用这样的深层嵌套视图。这接近你正在寻找的东西吗?