一直在寻找这个问题的答案,所以开始怀疑是否可能。
我正在我的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'
这样用户就可以点击这样的网址:'example.com/usa'
或'example.com/usa/2012'
(如果他们不提供一年,那么它只会获取最近几年的数据)
显然我在这里遇到了问题,因为当你访问时
'example.com/:country/:state/'
,路由提供者期望状态为年参数。
我的问题是反正允许这种结构吗?我不确定从哪里开始添加逻辑以允许两者,或者如果可能,所以任何建议都非常感谢。
* *编辑我已经阅读了一些关于ui.router和state params的内容,虽然我很少知道它,但想知道这是否可行?
答案 0 :(得分:0)
您是否考虑在路线中使用查询字符串?例如:
example.com/:country?year=2013&state=NY
这种方式它们是可选的,排序无关紧要。
答案 1 :(得分:0)
REST的原则建议您的网址应该描述您要检索的资源。
然而,这似乎很清楚,至少在我看来,这仍然意味着两种有效的方法。
HTTP查询
第一种是创建一个定义query
的URL,一个HTTP搜索所需的类型资源,然后通过细化指定所需的实际资源参数(被滥用的query string
)。在这种情况下,您不是使用REST URL,而是通过内部HTTP搜索机制搜索一个国家/地区。
这是一种非常有效的方法,可以享受HTTP上游缓存带来的好处。当您使用它来触发逻辑时,查询字符串只是bad thing
,换句话说,当您使用它来指定动作,动词而不是名词(又称RPC)时。{/ p>
The Query
'example.com/country'
The Refinement Parameters
- year or
- city or
- state
REST网址
第二种面向REST的方法要求每个不同的country+city+state+year
组合都有自己同样不同的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正在成倍增加并且它们冗长而繁琐,但该技术的煤面应用结果很好,网址清晰,简单如果需要,机器生成,并自我记录。
最后一点,如果您将ui.router
与AngularJS
一起使用,通常情况下您可以对用户将看到的面向公众的网址进行美化。毕竟使用SPA,他们实际上并没有“去”任何地方,而是指定客户端浏览器的内部状态,这样您就可以聪明地了解它们对您的意义。您将使用的大多数URL都是隐藏的API调用,它们可以而且应该尽可能具有表现力,即使它们很长并且乍一看似乎很麻烦。
简而言之,对于API调用,清晰简洁是一件好事。