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