【发布时间】:2017-05-06 11:15:07
【问题描述】:
期望的行为
我正在使用 AngularJS 和 Angular UI-Router。
- 我想允许两个子状态共享一个父状态。
- 我希望子状态用自己的视图填充父状态视图中的
ui-view。 - 我希望两个子状态之一的视图中有三个
ui-view,每个都充满视图。
尝试绘制图表:
Parent: <ui-view>
filled by
Child: <ui-view> <ui-view> <ui-view>
filled filled filled
我的情况的具体细节
我有一个名为category-details 的状态。在这个抽象状态的视图中,我有一个未命名的ui-view。在两个子状态之一 (category-details.selected) 我想使用 multiple named views。
当前的工作策略
这里是抽象状态。非常基本,但供您参考。
.state('category-details', {
abstract: true,
data: {
pageTitle: 'Category Details'
},
templateUrl: "views/category-details.html",
})
在category-details.selected 状态下(将有多个命名视图的状态),我将category-details.html 的未命名ui-view 设置为category-details-selected.html:
.state('category-details.selected', {
views: {
'': {
templateUrl: 'views/category-details-selected.html',
controller: 'CategoryDetailsSelectedCtrl'
}
}
})
在category-details-selected.html 视图中,我有三个名为ui-views:
<div ui-view="firstNamedView"></div>
<div ui-view="secondNamedView"></div>
<div ui-view="thirdNamedView"></div>
最后,我定义了一个状态来设置这三个ui-view,以满足我想要的行为的第三部分:
.state('category-details.selected.aspect', {
url:"/category-details/:selectedCategory",
views: {
'firstNamedView': {
templateUrl: 'views/first-named-view.html',
controller: 'FirstNamedViewCtrl'
},
'secondNamedView': {
templateUrl: 'views/second-named-view.html',
controller: 'SecondNamedViewCtrl'
},
'thirdNamedView': {
templateUrl: 'views/third-named-view.html',
controller: 'ThirdNamedViewCtrl'
}
}
});
为什么我的解决方案是尴尬和次优的
添加category-details.selected.aspect 状态来设置category-details-selected 视图的常量元素(三个ui-view)是不必要的。每次我想要多个命名视图时,它都会强制创建一个额外的状态。
我的尝试
我相信我应该能够将 category-details.selected.aspect 状态的 url 和视图移动到其父状态 (category-details.selected) 的 views 组件中。这看起来像:
.state('category-details.selected', {
url:"/category-details/:selectedCategory",
views: {
'': {
templateUrl: 'views/category-details-selected.html',
controller: 'CategoryDetailsSelectedCtrl'
},
'firstNamedView': {
templateUrl: 'views/first-named-view.html',
controller: 'FirstNamedViewCtrl'
},
'secondNamedView': {
templateUrl: 'views/second-named-view.html',
controller: 'SecondNamedViewCtrl'
},
'thirdNamedView': {
templateUrl: 'views/third-named-view.html',
controller: 'ThirdNamedViewCtrl'
}
}
})
这导致未命名的ui-view 设置正确,但未填写三个命名的ui-view。
由于选择三个名为 ui-view 的问题是问题所在,因此我尝试使用 absolute selectors described here 来选择它们。这并没有解决问题。我试过了:
firstNamedView
firstNamedView@
firstNamedView@category-details.selected
(others of course)
结束语
我想象的是否可行,是另一种更好的方法,还是我目前的方法是最好的?归结为同时设置父ui-view 的子ui-views。我认为最后一句话单独太令人困惑,所以我将整个示例包括在内。
如果我可以提供更多说明,例如版本,请告诉我。谢谢。
【问题讨论】:
标签: angularjs angular-ui-router