mik*_*kel 32 javascript model-view-controller url-routing angularjs
我可以在AngularJS中设置路由参数的默认值吗?有没有办法拥有/products/123和/products/处理相同的路线?
我想重构我现有的代码,看起来像:
myModule.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/products/', {templateUrl: 'products.html', controller: ProductsCtrl}).
when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl})
}]);
function ProductsCtrl($scope, $routeParams) {
$scope.productId = typeof($routeParams.productId) == "undefined" ? 123 : $routeParams.productId;
}
Run Code Online (Sandbox Code Playgroud)
它有效,但它不是很优雅.有没有更好的办法 ?
Jul*_*lzt 35
我知道这个问题已经过时了,但仍然存在:为什么不将"空"URL重定向到包含默认productId的URL?
myModule.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/products/', {redirectTo: '/products/123'}).
when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl})
}]);
Run Code Online (Sandbox Code Playgroud)
Har*_*rev 24
AngularJS 不允许路由参数的默认值.
但是路由(in AngularJS)不应该有默认参数.
资源可以有默认参数.
在AngularJS如果你想使用一个可选的参数的路线,这实际上是两个不同的路线.
为什么?
路线应该很简单
路由不允许正则表达式匹配参数
路由不是暴露API在您的应用程序中工作的东西(与Resources不同).路由只是将URL与模板和控制器连接起来的配置.因此拥有更多路线更好:
很清楚哪条路线映射到哪个URL.
它更冗长,但更容易阅读.拥有更复杂的路线会在AngularJS不需要的情况下创建更陡峭的学习曲线.
与具有路由的服务器端框架不同
更简单的路线=更多的线来定义它们=减少使用它们的头痛.
注意:请记住这个问题,这个答案是针对旧版本的AngularJS(我认为是1.0)在新路线/资源实施之前进行的.
我有类似的要求.我所做的是创建一个解决的功能.像下面的东西
myModule.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/products/', resolveProduct()).
when('/products/:productId', resolveProduct())
}]);
function ProductsCtrl($scope, $routeParams) {
$scope.productId = $routeParams.productId;
}
function resolveProduct() {
var routeConfig = {
templateUrl: 'products.html',
controller: ProductsCtrl,
resolve: {
productId: ['$route', function($route){
var params = $route.current.params;
params.productId = params.productId || 123;
}]
}
}
return routeConfig;
}
Run Code Online (Sandbox Code Playgroud)