Angularjs 在app.js之外定义路由

Angularjs 在app.js之外定义路由,angularjs,Angularjs,我被告知,在AngularJS中,您应该在一个文件中完成所有路由。现在,我觉得这有一个根本性的问题。如果您有一个大型web应用程序,那么将每个可能的路由发送给用户似乎没有意义。这意味着,您的主JavaScript文件可能会以如下路径结束:path/:to/a/part/:of/my/application 我习惯了另一种路由方式,主路由器有某些路由(例如/admin,/blog,/about)。博客的所有逻辑(如进一步路由)都在(例如,blog.js中处理。在blog.js中,有一些路由,例如/

我被告知,在AngularJS中,您应该在一个文件中完成所有路由。现在,我觉得这有一个根本性的问题。如果您有一个大型web应用程序,那么将每个可能的路由发送给用户似乎没有意义。这意味着,您的主JavaScript文件可能会以如下路径结束:path/:to/a/part/:of/my/application

我习惯了另一种路由方式,主路由器有某些路由(例如
/admin
/blog
/about
)。博客的所有逻辑(如进一步路由)都在(例如,
blog.js
中处理。在
blog.js
中,有一些路由,例如
/latest
,最终成为最终路由
/blog/latest


一个人如何在有限的时间内做到这一点?还是我完全没有理解Angular的要点?

你不必在一个文件中或在app.js中完成所有路由。它只需要在配置块中完成。由于Angular应用程序应在全局命名空间中定义,因此您可以有一个单独的文件,该文件的开头如下:

yourAngularApp.config([
    '$routeProvider',
    '$locationProvider',
    function ($routeProvider, $locationProvider) {
        // Your routing code
]);
因此,您可以随意分离路由代码

请参阅“模块加载和依赖项”和“配置块”标题下的其他配置块:


我试图实现的只是公开
/blog/latest
路由一旦您请求页面
/blog
,就不需要知道了 如果您对
/blog
也不感兴趣,则存在
/blog/latest

如果导航到
/blog
导致页面刷新,则此目标不难实现。你可以这样构造你的应用程序

  • 您的主要路由在单个文件中定义,然后
  • 您的进一步的,
    /blog
    -相关路由位于一个单独的文件中,只有在您位于该应用程序的该区域时,才能下载该文件
但是,如果您的应用程序是一个完整的SPA,并且在请求
/blog
页面时Angular不会再次启动,那么这种方法将不起作用。我读过一种更复杂的方法,它涉及保存对routeProvider的引用以供以后使用:

yourAngularApp.config([
    '$routeProvider',
    '$locationProvider',
    function ($routeProvider, $locationProvider) {
        // Your routing code
        yourAngularApp.routeProvider = $routeProvider;
]);
然后,您可以稍后使用AngularApp.routeProvider(例如,在控制器中)进一步配置路由


我在这里找到了比这更干净的解决方案:

该方法的要点是,您可以在配置阶段创建$route装饰器,并使用它公开$routeProvider功能

为了完整起见,下面是该代码的主要部分。首先,在配置阶段定义decorator来修改$route,公开$routeProvider中您喜欢的任何功能(我的示例仅显示
.when()
):

然后,您可以将$route注入其他区域,如控制器和服务:

yourAngularApp.controller(
    "YourController",
    function($scope, $route) {
        // code that modifies routing here
        // ...
        $route.reload();
    }
);

我认为最好的方法是将你的应用程序分成几个模块,然后每个模块都有自己的路由。重点是,对于ngRoute这样的模块,似乎所有的东西都必须放在一个文件中才能工作。我试图实现的目标是,一旦您请求页面
/blog
,就只公开
/blog/latest
路径,如果您对
/blog
也不感兴趣,那么知道
/blog/latest
存在是不相关的。angular ui router(如@user2892650所述)似乎无法解决这一问题(从我所知),啊,我在阅读你的问题@RubenRutten时微妙地忽略了这一点(或者至少我会称之为微妙,以暗示我并非只是不小心忽略了你的观点=P)。我将更新我的答案以回应您的评论。@RubenRutten很抱歉,我已经更新了我的答案(并在这个过程中学到了一些东西!)。
yourAngularApp.controller(
    "YourController",
    function($scope, $route) {
        // code that modifies routing here
        // ...
        $route.reload();
    }
);