有一个工作plunker
这里的解决方案可能有两种类型。第一个真的非常有活力。第二个是根据需要工作,有点严格,但可以从UI-Router
内置功能中受益。
一、动态方法
让我们观察第一个,这很有趣(但在我们的场景中可能太复杂了)。和这个问答很相似
递归 ui 路由器嵌套视图
我们尝试解决包含未知数量的文件夹*(目录)*名称的网址:
<a href="#/files/Folder1">
<a href="#/files/Folder1/SubFolder1/">
<a href="#/files/Folder1/SubFolder1/SubFolderA">
状态可以这样定义:
.state('files', {
url: '/files/{folderPath:[a-zA-Z0-9/]*}',
templateUrl: 'tpl.files.html',
...
这将导致一个folderPath
带有完整文件夹路径的参数。
如果我们想解决我们的场景(正好处理三个参数),我们可以扩展这样的东西
文件处理控制器:
.controller('FileCtrl', function($scope, a, b, c) {
$scope.paramA = a;
$scope.paramB = b;
$scope.paramC = c;
})
使用解析器的状态定义:
// helper method
var findParams = function($stateParams, position) {
var parts = $stateParams.folderPath.split('/')
var result = parts.length >= position ? parts[position] : null;
return result;
}
...
// state calls resolver to parse params and pass them into controller
.state('files', {
url: '/files/{folderPath:[a-zA-Z0-9/]*}',
templateUrl: 'tpl.files.html',
controller: 'FileCtrl',
resolve: {
a : ['$stateParams', function($stateParams) {return findParams($stateParams, 0)}],
b : ['$stateParams', function($stateParams) {return findParams($stateParams, 1)}],
c : ['$stateParams', function($stateParams) {return findParams($stateParams, 2)}],
}
})
二、UI-Router 内置功能params : {}
第二种情况,其实非常非常简单。它使用UI-Router
内置功能:params : {}
. 在此处查看其文档:
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state .$stateProvider
这将是我们的状态定义:
.state('login', {
url: '/login/:a/:b/:c',
templateUrl: 'tpl.login.html',
controller: 'LoginCtrl',
params: {
a: {squash: true, value: null},
b: {squash: true, value: null},
c: {squash: true, value: null},
}
})
所有这些链接也将起作用:
<a href="#/login">
<a href="#/login/ValueA">
<a href="#/login/ValueA/ValueB">
<a href="#/login/ValueA/ValueB/ValueC">
诀窍是什么:
squash
- {bool|string=}
: squash 配置当当前参数值与默认值相同时,如何在 URL 中表示默认参数值。如果未设置壁球,则使用配置的默认壁球策略。
在这里检查它的行动