好的,所以我对此进行了测试,它适用于我的情况。当状态只是一个参数时它会失败,但似乎只要每个状态都有一个非参数化位,ui-router 就能够解析到子状态。我以前从未在任何地方看到过这个案例的演示或解释。大多数教程只涵盖简单的硬编码嵌套状态,而不是参数化的。
这并不理想,但它有效。
我希望这可以帮助其他人面临这个问题。:)
var app = angular.module('app', ['ui.router'])
.config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function ( $stateProvider, $urlRouterProvider, $locationProvider) {
$urlRouterProvider.otherwise("/");
$locationProvider.html5Mode(true);
var semester = {
name: "semester",
abstract: true,
url: "semester/:sem",
templateUrl: "http://localhost:81/route/to/semtemplate.tpl.html",
controller: "semesterController"
},
program = {
name: "program",
parent: sem,
url: "program/:prg",
templateUrl: "http://localhost:81/route/to/prgtemplate.tpl.html",
controller: "programController"
},
classes = {
name: "classes",
parent: prg,
url: "/classes",
templateUrl: "http://localhost:81/route/to/clstemplate.tpl.html",
controller: "classesController"
};
$stateProvider.state(sem)
.state(prg)
.state(classes);
}]);
app.controller('paraController', ['$scope', '$stateParams', '$state',function($scope, $state, $stateParams){
console.log('paraController instantiated');
$scope.sem = $stateParams.params.sem;
$scope.prg = $stateParams.params.prg;
}]);
由于这是一个分层 REST api,因此该模式可以完美运行,并且当还利用每个控制器的范围继承时,它应该非常适合我的项目。我没有测试过嵌套状态的极端情况,但是看看它在更多参数化状态下的表现会很有趣。我发现的唯一限制是每个状态也需要有一个非参数化部分。所以/:sem
失败但semester/:sem
工作正常。
这并不理想,因为它会使 URL 更长,但我还没有找到可行的替代方案。