我在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)不会在页面上重新加载控制器。只有改变状态才能做到这一点。改变这种行为是有选择的,但对我来说总是很麻烦的。

10-04 17:14