以故事形式:
我在这里寻找的是一个主要细节设置。主人是列表形式,当我点击链接(相对于特定的行/记录(或本例中的帐户))时,我想在主视图中看到详细信息(字面意思是“主要”视图:{{ 1}})。
我想要这样做并维护我的网址结构(<div class="container" ui-view="main"></div>
用于帐户列表; /accounts
用于详细版本)但我希望详细视图使用视图列表正在使用。
我目前拥有什么
的index.html
/accounts/:id
accounts.js
...
<div class="container" ui-view="main"></div>
...
此时,$stateProvider
.state ('accounts', {
url: '/accounts',
views: {
'main': {
controller: 'AccountsCtrl',
templateUrl: 'accounts/accounts.tpl.html'
}
},
data: { pageTitle: 'Account' }
})
.state ('accounts.detail', {
url: '/:id',
views: {
'main': {
controller: 'AccountDetailCtrl',
templateUrl: 'accounts/detail.tpl.html'
}
},
data: { pageTitle: 'Account Detail' }
});
路由按预期工作。它会在/accounts
视图中正确显示accounts/accounts.tpl.html
。在main
中,转发器中的每一行都将其链接到相应的html
网址,我使用嵌套状态/accounts/:id
处理该网址。
对于比我更了解此事的大多数人来说,显而易见的是,如果模板{{1}中存在该命名视图,我的accounts.detail
将呈现给视图accounts.detail
}} 即可。确实如此。
但这不是我想要的。我希望main
内容在父accounts/accounts.tpl.html
视图中呈现;我希望accounts.detail
的html 替换 main
中找到的accounts/detail.tpl.html
的html。
那么我怎么能做到这一点?
我的解决方案背景
正如答案所说,诀窍是设置URL方案以识别哪个子状态是“默认”。我用简单的英语解释这段代码的方式是父类是抽象的,带有正确的URL,“默认”子类具有“相同”的URL(由accounts/accounts.tpl.html
表示)。
如果您需要进一步明确,只需发表评论,我将分享更多指导。
index.html: <div class="container" ui-view="main"></div>
答案 0 :(得分:38)
听起来你根本不希望视图是分层的。为此,只需将第二个州的名称更改为detail
即可。
但请注意,这样做会丢失状态树的任何层次结构属性(例如,控制器代码帐户状态)。
如果你想保持控制器的层次结构,但是要执行html的替换,我会创建另一个父节点来处理控制器逻辑,但只有一个非常简单的视图<div ui-view=""></div>
。 / p>
例如:
$stateProvider
.state('app', { url: '', abstract: true, template: 'parent.html', controller: 'ParentCtrl' })
.state('app.accounts', { url: '/accounts', templateUrl: 'accounts.tpl.html', controller: 'AccountsCtrl' })
.state('app.detail', { url: '/accounts/:id', templateUrl: 'detail.tpl.html', controller: 'AccountDetailCtrl' });
答案 1 :(得分:14)
您可以使用'@'来定义您选择的ui-view的绝对路径。例如:“detail @ contacts”:{},这绝对是“联系人”状态中“详细信息”视图的目标。在contacts.html中
来源:https://github.com/angular-ui/ui-router/wiki/Multiple-Named-Views