【发布时间】:2014-05-05 12:38:49
【问题描述】:
我刚刚开始玩 UI 路由器,主要是因为能够声明嵌套状态和命名视图。
这是我如何配置两者组合的简化示例:
$stateProvider.state("page", {
abstract: true,
templateUrl: "page.html"
})
.state("page.stream", {
url: "/stream",
controller: "StreamCtrl",
views: {
content: {
templateUrl: "stream-content.html"
},
header: {
templateUrl: "stream-header.html"
}
}
})
.state("page.notifications", {
url: "/notifications",
controller: "NotifsCtrl",
views: {
content: {
templateUrl: "notifs-content.html"
},
header: {
templateUrl: "notifs-header.html"
}
}
})
我已将page 视图声明为抽象视图,因为它的唯一目的是保存另外两个视图,变量header 和content,以及跨页面静态导航。
<!-- page.html -->
<nav>...</nav>
<div ui-view="header"></div>
<div ui-view="content"></div>
路由和插入模板按预期工作,导航到/stream 或/notifications 时保持静态,并且标题和内容视图发生变化。但是,在 page.stream 和 page.notifications 上声明的控制器不会被启动。
我的第一个直觉是,在状态配置的视图对象旁边声明一个控制器会导致在整个页面上设置控制器,因此标题和内容将共享控制器的 $scope。
在page 状态下声明控制器可以实现这一点,但使用controllerProvider 并不能让我获得足够的信息来决定使用哪个控制器:
$stateProvider.state("page", {
abstract: true,
templateUrl: "page.html",
controllerProvider: function ($stateParams) {
// How do I know which state I am in, notifications or stream?
return ???
}
})
在声明视图名称时,我尝试使用不同的表示法(绝对/相对),并且我在以下方面取得了一些运气:
$stateProvider.state("page.stream", {
url: "/stream",
views: {
// I understand that this targets the parent page which holds both header and content
"@": {
controller: "StreamController"
},
page: {...}
header: {...}
}
})
这确实在整个页面上设置了 StreamController,但导致两个模板都丢失了,好像从未加载过 page.html。
我应该在每个页面子状态的哪里设置控制器,以便子状态中的每个视图共享控制器的 $scope?
【问题讨论】:
标签: javascript angularjs routes url-routing angular-ui-router