我在angularjs中使用ui路由器时遇到了url结构问题。我想有这样一个一级搜索引擎优化友好的网址结构:
https://people-profile.com/mike-david-tringe
所以我可以通过stateparam获取seo名称“mike david tringe”,并使用它在数据库中查找数据并填充页面。
$stateprovider有如下代码:
$stateProvider
.state('people', {
url: '/:nameUrl',
templateUrl: 'app/frontend/page.tmpl.html',
params: {
nameUrl: {squash: true},
},
controller: "PageController",
controllerAs: 'vm'
})
.state('admin', {
url:'/admin/:userId',
templateUrl:'app/frontend/admin/admin.html',
controller:'AdminController',
controllerAs: 'admin'
})
有了上面的代码,我可以使用https://people-profile.com/mike-david-tringe与nameurl=mike david tringe一起工作,并且我得到了对seo友好的一级url链接。mike david tringe对搜索引擎优化很友好,是域名旁边最重要的关键词。
但有了这个结构,https://people-profile.com/admin/或https://people-profile.com/login/现在就不起作用了。因为我的控制器试图获取管理员作为nameurl并查找数据。而且admin不是nameURL,所以我的数据库将返回null,应用程序将失败。
简而言之,stateparam nameurl将获取“/”之后的任何内容,因此url设置将认为admin和login是:nameurl,但实际上不是。
那么我该如何构造我的app ui路由器结构,使其具有像https://people-profile.com/mike-david-tringe这样的搜索引擎优化友好的url,但是当urlhttps://people-profile.com/admin/时,它将加载admin.html模板并使用admincontroller,而不是像我在$stateprovider中定义的那样?
最佳答案
你所要做的就是交换它们的顺序。路由器将按定义的顺序进行检查,因此如果/:nameurl在/admin之前,它将首先触发。但是如果你把/:nameurl放在最后,那么它将触发任何尚未触发上述内容的url。
不过,这是一个警告。在触发相同状态的两个url之间移动(就像在您的例子中两个url都达到了/:nameurl)不会在页面上重新加载控制器。只有改变状态才能做到这一点。改变这种行为是有选择的,但对我来说总是很麻烦的。