2012-09-21 100 views
30

我可以在AngularJS中设置路径参数的默认值吗?有没有办法让/products/123/products/由相同的路线处理?angularjs路由可以有默认参数值吗?

我期待我的重构现有的代码,它看起来像:

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; 
} 

它的工作原理,但它不是很优雅。有没有更好的办法 ?

+0

不熟悉angularJS,但对于'无功PARAM = {templateUrl实现这一目标:ProductsCtrl}; $ routeProvider.when('/ products /',param).when('/ products /:productId',param)'? – Rufus

+3

您可以简化您的控制器代码:$ scope.productId = $ routeParams.productId || 123; – Gloopy

+0

@Gloopy这当然适用,如果productId == 0不是一个有效的ID –

回答

24

AngularJS不允许路由参数的默认值。

但是路由(在AngularJS不应该有默认参数。

资源可能有默认参数。

AngularJS如果你想要一个具有可选参数的路由,它们实际上是两条不同的路由。

为什么?

  • 路线应该是简单

  • 路线不允许正则表达式匹配的参数

  • 路由是不是暴露了一个API在应用程序中工作(与资源做)。路由只是将URL与模板和控制器连接起来的配置。因此有更多的路线是更好的:

    • 很清楚哪个路线映射到哪个url。

    • 这是更详细,但更易于阅读。拥有更复杂的路线可以创建更陡峭的学习曲线,AngularJS不需要一个。

不像有路线

  • AngularJS路线没有名字服务器端框架。
  • 您不会根据定义的路线构建网址。
  • 您在路由定义中没有逻辑(a.k.a函数)。

更简单的路线=更多的线来定义它们=减少头痛与他们合作。

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

+19

虽然这可能是正确的答案,但我没有看到任何有力的论据,应该阻止AngularJS使用默认参数或更好的路由匹配。重复相同的代码始终是维护的问题。 –

+0

@ edA-qamort-ora-y我的观点是,在目前的AngularJS路线中(这可能会改变),路线应该保持简单。 –

+1

尽管这个对话有点过时,但我听说在Angular 2发行版中会支持路由的模式匹配,这可能还包括一些方法来执行可选参数或默认参数。 – shaunhusain

34

我认识到这个问题已经过时了,但仍然存在:为什么不将“空”URL重定向到包含默认产品ID的URL呢?

myModule.config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
    when('/products/', {redirectTo: '/products/123'}). 
    when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl}) 
}]); 
+0

方法重载FTW! –

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; 
} 
2

With url:“/ view /:id /:status?”,您可以指定一个可选参数。

只是觉得有人可能需要它。 “products.html放在”,控制器:

1

不知道这个问题是特定于$routeProvider$stateProvider,您可以通过

myApp.config(function($stateProvider) { 

    $stateProvider 
     .state('products', { 
      url: '/:productId', 
      templateUrl: "/dashboard/products.html", 
      controller: 'ProductController', 
      params: { 
       productId: { 
        value: "defaultValue", 
        squash: true // or enable this instead to squash `productId` when empty 
       } 
      } 
     }); 
});