【问题标题】:Can angularjs routes have optional parameter values?angularjs 路由可以有可选的参数值吗?
【发布时间】:2013-07-04 20:38:34
【问题描述】:

我可以设置带有可选参数的路由(相同的模板和控制器,但如果它们不存在应该忽略某些参数?

所以不要写下面两条规则,只有一条?

module.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
     when('/users/', {templateUrl: 'template.tpl.html', controller: myCtrl}).            
     when('/users/:userId', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

类似这样的东西([这个参数是可选的])

when('/users[/:userId]', {templateUrl: 'template.tpl.html', controller: myCtrl})
//note: this previous doesn't work

我在他们的文档中找不到任何内容。

【问题讨论】:

  • 在 1.1.5 版本中它们将被忽略(没有[])。
  • 真的吗?我在 1.1.5 ,尝试使用代码 [:userId] 并且没有忽略它们。
  • 尝试不使用[]。请参阅此提交:github.com/angular/angular.js/commit/…
  • 哎呀,对不起,这是关于 $resource 的,不确定它是否适用于路由。对不起。
  • 如果 g-orge 的答案很好,请您标记一下,这样人们就不必滚动整个内容即可找到最佳答案?

标签: angularjs angularjs-routing


【解决方案1】:

现在看来 Angular 已经支持这个了。

来自$routeProvider.when(path, route) 的最新 (v1.2.0) 文档:

path 可以包含带有问号 (:name?) 的可选命名组

【讨论】:

  • 有什么方法可以避免使用斜杠吗?如果我的路线是:.when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...,如果 url 没有尾部斜杠,它将不匹配。所以/claims/documents/1234/ 匹配,但/claims/documents/1234 不匹配。
  • 想知道是否有人对@JamesBell 报告的问题有解决方案
  • 从 Angular 1.3 开始,上述 cmets 中提到的斜杠问题已修复。导航到 /claims/documents/1234/ 可以正常工作,/claims/documents/1234 也是如此。简而言之,它可以带或不带斜杠。
  • 如果我的路线中有一个可选参数,我仍然会看到这种行为。例如:如果路线是:'/:classification?/package/compare' 并且我尝试导航到 url "/package/compare" 它可以工作。如果我出于某种原因尝试“/package/compare/”,则会将 asci 代码附加到分类中,或者“/%3f/package/compare”不是实际路线。
  • 文档混乱。
【解决方案2】:

就像@g-eorge 提到的,你可以这样:

module.config(['$routeProvider', function($routeProvider) {
$routeProvider.
  when('/users/:userId?', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

您也可以根据需要设置可选参数。

【讨论】:

    【解决方案3】:

    请在此处查看@jlareau 答案:https://stackoverflow.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

    您可以使用函数来生成模板字符串:

    var app = angular.module('app',[]);
    
    app.config(
        function($routeProvider) {
            $routeProvider.
                when('/', {templateUrl:'/home'}).
                when('/users/:user_id', 
                    {   
                        controller:UserView, 
                        templateUrl: function(params){ return '/users/view/' + params.user_id;   }
                    }
                ).
                otherwise({redirectTo:'/'});
        }
    );
    

    【讨论】:

      【解决方案4】:

      其实我认为 OZ_ 可能有些正确。

      如果您有路由 '/users/:userId' 并导航到 '/users/'(注意尾随 /),则控制器中的 $routeParams 应该是 1.1.5 中包含 userId: "" 的对象。所以没有参数userId 没有被完全忽略,但我认为这是你会得到的最好的。

      【讨论】:

        猜你喜欢
        • 2012-09-13
        • 2016-08-22
        • 2023-02-25
        • 2015-12-05
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多