angularjs路由可以有默认参数值吗?

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路由没有名称.
  • 您不从定义的路由构建URL.
  • 您在路径定义中没有逻辑(也就是函数).

更简单的路线=更多的线来定义它们=减少使用它们的头痛.

注意:请记住这个问题,这个答案是针对旧版本的AngularJS(我认为是1.0)在新路线/资源实施之前进行的.

  • 虽然这可能是正确的答案,但我没有看到任何强有力的论据,这应该阻止AngularJS具有默认参数或更好的路由匹配.重复相同的代码始终是维护的问题. (19认同)
  • 可选路线现在可用http://stackoverflow.com/questions/17510962/can-angularjs-routes-have-optional-parameter-values (2认同)

Bre*_*ren 6

我有类似的要求.我所做的是创建一个解决的功能.像下面的东西

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)