Javascript AngularJS中不同的URL参数

Javascript AngularJS中不同的URL参数,javascript,angularjs,url-routing,Javascript,Angularjs,Url Routing,我一直在寻找这个问题的答案,所以开始怀疑这是否可能 我正在Angular应用程序中构建routeProvider配置,它依赖于位置名称和年份参数来聚合数据。理想情况下(虽然不知道是否可能),我希望能够有以下可能的url结构: 'example.com/:country' 'example.com/:country/:year' 'example.com/:country/:state/' 'example.com/:country/:state/:year' 'example.com/:coun

我一直在寻找这个问题的答案,所以开始怀疑这是否可能

我正在Angular应用程序中构建routeProvider配置,它依赖于位置名称和年份参数来聚合数据。理想情况下(虽然不知道是否可能),我希望能够有以下可能的url结构:

'example.com/:country'
'example.com/:country/:year'
'example.com/:country/:state/'
'example.com/:country/:state/:year'
'example.com/:country/:state/:city'
'example.com/:country/:state/:city/:year'
因此,用户可以点击如下URL:
'example.com/usa'
'example.com/usa/2012'
(如果他们不提供年份,它只会获取最近几年的数据) 显然,我在这里遇到了问题,因为当你访问
“example.com/:country/:state/”
,路由提供程序希望state是一个年份参数

我的问题是,是否允许这种结构?我真的不知道从哪里开始添加逻辑以允许两者,或者如果可能的话,因此非常感谢您的任何建议


**Edit我已经读了一些关于ui.router和state参数的书,虽然我承认对它知之甚少,但我想知道这是否会起作用?

您是否考虑过在路由中使用查询字符串?例如:

example.com/:国家?年份=2013年&州=NY


这样一来,它们是可选的,排序是不相关的。

REST原则建议您的URL应该描述您希望检索的资源

这似乎足够清楚,但至少在我看来,这仍然意味着两种有效的方法

HTTP查询

第一种方法是创建一个URL,该URL定义了一个
查询
,一个针对所需类型资源的HTTP搜索,然后通过优化参数(被滥用的
查询字符串
)指定所需的实际资源。在这种情况下,您不使用RESTURL,而是通过固有的HTTP搜索机制搜索国家

这是一种非常有效的方法,可以享受HTTP上游缓存的好处。当您使用查询字符串来触发逻辑时,也就是说,当您使用它来指定动作、动词而不是名词(又称RPC)时,它只是一个
坏东西

REST URL

第二种是面向REST的方法,要求每个不同的
国家+城市+州+年份的组合都有自己的相同URL

我相信这就是你想要达到的目标,但是你失败了,因为你试图过于简洁。没有足够的URL结构来唯一区分每个可能的资源

要解决此问题,您只需添加更多URL结构,如下所示:

//Syntax for ui.router
'example.com/country/{country}'
'example.com/country/{country}/year/{year}'
'example.com/country/state/{state}'
'example.com/country/state/{state}/year/{year}'
'example.com/country/state/{state}/city/{city}'
'example.com/country/state/{state}/city/{city}/year/{year}'
您可以将所有这些路由连接到同一个控制器,并将逻辑放在那里,或者在不同的控制器之间划分它们,因为它们接收的数据必须存在

这是我通常使用的方法,虽然一开始感觉URL在成倍增加,而且很长很麻烦,但该技术在采煤工作面的应用结果很好,URL很清晰,如果需要,很容易通过机器生成,并且可以自我记录

最后一点,如果您将
ui.router
AngularJS
一起使用,通常情况下,您可以美化面向公众的URL,用户将看到这些URL。毕竟,使用SPA,它们实际上并不是“去”任何地方,而是指定客户端浏览器的内部状态,这样您就可以了解它们对您意味着什么。您将要使用的大多数URL都是隐藏的API调用,它们可以而且应该尽可能具有表现力,即使它们很长,乍一看似乎很麻烦


简而言之,对于API调用来说,清晰而不是简洁是一件好事。

我也开始学习路由。正如你所指出的,它似乎没有那么动态。它似乎被黑客攻击得很厉害,但我想你可以在一个控制器中解析完整的URL来获得想要的效果。确实不是正确的方法,但至少从我所知道的来看,Angular只关注第一个参数,正如你的帖子所建议的。在更多地查看ui router时,我发现了一种可能的有点黑客的方法,ui router支持参数的正则表达式模式。因此,我可以检查参数是否仅为数字或仅为字符..虽然这让我觉得hacky在本例中使用查询参数而不是routes pass:country可能更有意义,因为顺序不确定。是的,这就是我最初的想法,但我想看看是否有人有其他想法。谢谢,这是我所怀疑的,但你的解释让我更加清醒了
//Syntax for ui.router
'example.com/country/{country}'
'example.com/country/{country}/year/{year}'
'example.com/country/state/{state}'
'example.com/country/state/{state}/year/{year}'
'example.com/country/state/{state}/city/{city}'
'example.com/country/state/{state}/city/{city}/year/{year}'