angularjs 路由可以有可选的参数值吗?

Posted

技术标签:

【中文标题】angularjs 路由可以有可选的参数值吗?【英文标题】:Can angularjs routes have optional parameter values? 【发布时间】: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 的答案很好,请您标记一下,这样人们就不必滚动整个内容即可找到最佳答案? 【参考方案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://***.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 没有被完全忽略,但我认为这是你会得到的最好的。

【讨论】:

以上是关于angularjs 路由可以有可选的参数值吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

ASP.NET Web API 中带有可选参数的属性路由

可选的反应路由器参数标记 GET 请求错误?

可选的反应路由器参数

typescript 可选的路由参数

typescript 可选的路由参数