UI-Router在未在状态中定义时让URL通过

时间:2013-12-23 20:43:41

标签: angularjs angular-ui-router

我想使用Angular UI-Router但是我需要它让任何url通过浏览器(并使浏览器导航页面)$stateProvider中未定义(url)或$urlRouterProvider

我搜索了他们的文档,API等,但找不到这个的参考,除了我以前用过的$state.reload() ..

1 个答案:

答案 0 :(得分:2)

更新:请参阅底部的更新。

根据您的评论,我假设以下内容:

  • 您的Angular应用程序位于域foo.com/
  • 的根目录下
  • 您正在使用HTML5模式,因此您的应用会响应"自然"类似于foo.com/thing1foo.com/thing2
  • 的网址
  • 您有一些其他应用(不是您的主要Angular应用),它位于foo.com/admin

不幸的是,你不能通过"通过"就像你想要的那样。 :(

您的选择是:

  • 将您的Angular应用移动到foo.com/app等子目录中。然后,您的应用会响应foo.com/app/thing1foo.com/app/thing2等网址。
    • 如果你想使用HTML5路由模式来获得自然"这真的是唯一的选择。寻找网址。
  • 关闭HTML5路由模式,以便您的Angular应用程序位于http://foo.com/#/,并响应foo.com/#/thing1foo.com/#/thing2等网址。然后,当您的用户访问foo.com/admin时,该网址将会落入服务器并获取其中提供的任何应用。

注意:这适用于使用$routeProvider的常规Angular路由以及Angular-UI的$stateProvider

<强>更新

为了让这个工作变得有效,你必须让网址改变发生在Angular的 outstide 。这是一种可行的方法,但它对IMO来说有很多气味,很可能很脆弱,很难维护。

angular.module('myApp', [])
   .run(function($rootScope, $window){
      $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){
        // You'll probably want to just watch the path and build the full url
        // based on your environment, but this will get you started.
        if(newUrl === 'http://127.0.0.1/admin') {
          // prevent Angular from continuing with the location change
          event.preventDefault();
          // $window is an Angular wrapper around the global ``window`` object.
          // This causes the browser to go to the new url outside of Angular
          $window.location.href = newUrl;
        }
      });
});

当然,为了实现这一点,您的服务器必须设置为在/admin路径上为其他应用提供服务。此外,当您的用户导航回您的Angular应用时,它将失去所有状态,因为Angular应用将重新开始新鲜。此外,您的用户必须返回到Angular应用的 root 。如果用户从foo.com/转到foo.com/thing1foo.com/admin,则需要导航回foo.com/以重新访问您的Angular应用。