我可以使用正则表达式将外部URL重新路由到特定的Angular Route吗?

时间:2014-06-02 17:25:50

标签: regex angularjs angular-ui-router

在我第一次尝试解决此问题时,我询问了如何在following question posted here中为一个$状态设置多个静态网址。在发现Angular无法使用别名之后,我很快意识到这将是一个没有URL基础的问题,因为在URL中传递的所有内容都成为参数并搞砸了应用程序。

因此,为了从另一个角度解决这个问题,我想我可以使用正则表达式和sting匹配将传入的URL重新路由到其正确的Angular计数器部分。唯一的问题是我不知道Angular是否可以做到这一点而且我对正则表达式很糟糕......

因此考虑到我的原始帖子和设置我有一个像这样设置的当前路线。

 .state('ball', {
    parent: 'ballLayout',
    url: '/ball/{urlName}',
    views: {
      'cube.head': {
        templateUrl: 'partials/views/ball.head.html',
        controller: 'BallCtrl'
      }
    }
  });

外部Rails应用程序最多可以有4种不同的URL结构,这些URL结构都会路由到相同的标题,如此

球/标题页外

蝙蝠/标题页外

篮/标题页外

兽/标题页外

我想做的是让我的Angular应用程序匹配球,蝙蝠,篮子或野兽,并始终将其返回到球/标题页

因此,如果有人从Rails一侧发出 beast / page-of-page 的链接,则会看到它并将其映射到到ball / title-of-page < / strong>即可。这可能吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,解决方案可能就像(查看工作plunker

我们将使用

  • rule()用于自定义网址处理

这是片段:

$urlRouterProvider.rule(function ($injector, $location) {

    var path = $location.path(),
        searchFor = /(ball|bat|basket|beast)/i, // the regex
        replaceWith = 'ball';

   var wasFound  = path.search(searchFor) > -1; // is there a match?

   return wasFound
   ? path.replace(searchFor, replaceWith)  // replace first occurance
   : path;

});

现在,所有网址都是:

  <li><a href="#/BALL/title-of-page-ball">ball</a></li>
  <li><a href="#/bat/title-of-page-bat">bat</a></li>
  <li><a href="#/basket/title-of-page-basket">basket</a></li>
  <li><a href="#/beast/title-of-page-beast">beast</a></li>

将转换为:

href="#/ball/...."

工作plunker ...