如何在Angular.js中推迟path定义?

我已经configuration了所有用户login前可以使用的一些基本路由:

App.config(function ($routeProvider) { $routeProvider. when('/login', { templateUrl: 'views/login.html', controller: PageStartCtrl.Controller }). otherwise({ redirectTo: '/login' }); }); 

所以用户可以做的唯一事情就是login。在用户login后,我想要注册其他的路由,例如:

 $http .post('api/Users/Login', { User: userName, Password: userPassword }) .success(function (response : any) { App.config(function ($routeProvider) { $routeProvider .when('/dashboard', { templateUrl: 'part/dashboard.html', controller: DashboardCtrl.Controller }); }); 

但是,我想我应该只调用一次.config方法,因为$ routeProvider是一个全新的实例,对/ login路由一无所知。 进一步的debugging表明,当parsing视图更改时,会使用$ resourceProvider的第一个实例。

问:以后如何注册路线有办法吗?

从路由和模板dynamic添加到$ routeProvider的解决scheme可能工作,但相当丑陋(涉及全局variablesnastyGlobalReferenceToRouteProvider )。

由于路由是在提供者级别上定义的,因此通常只能在configuration块中定义新路由。 麻烦的是,在configuration块中,所有重要的服务仍然是未定义的(最显着的是$http )。 所以,表面上看起来w不能dynamic地定义路由。

现在事实certificate, 在应用程序生命周期的任何时候,添加/删除路由都是非常容易的! 查看$route 源代码,我们可以看到所有的路由定义都保存在$route.routes哈希中, $route.routes哈希可以像任何时候一样修改(简单示例):

 myApp.controller('MyCtrl', function($scope, $route) { $scope.defineRoute = function() { $route.routes['/dynamic'] = {templateUrl: 'dynamic.tpl.html'}; }; }); 

这里是jsFiddle在行动中演示这个: http : //jsfiddle.net/4zwdf/6/

实际上,如果我们想要接近AngularJS所做的事情,那么路由定义逻辑应该更复杂一些,因为AngularJS也定义了一个redirect路由来正确处理路由(最终使其成为可选)。

所以,虽然上面的技术可行,但我们需要注意以下几点:

  • 这种技术取决于内部实现,如果AngularJS团队决定改变路由的定义/匹配方式,则可能会中断
  • 也可以使用$route.routes定义otherwise路由,因为默认路由被存储在null键下的同一个散列

我发现@ pkozlowski.opensource的答案只适用于angularjs 1.0.1。 但是,在后来的版本中,angular-route.js成为一个独立的文件后,直接设置$ route不起作用。

在审查代码后,我发现$ route.routes的关键字不再用于匹配位置,而是使用$ route.route [key] .RegExp来代替。 当我复制原点时和pathRegExp函数,路由工作。 见jsfiddle: http : //jsfiddle.net/5FUQa/1/

  function addRoute(path, route) { //slightly modified 'when' function in angular-route.js } addRoute('/dynamic', { templateUrl: 'dynamic.tpl.html' }); 
Interesting Posts