我想知道配置路由的最佳方法是什么,其唯一目的是利用服务调用然后重定向。
我正在使用这个黑客:
$routeProvider.when('/talks', {
template: '<div></div>',
controller: ['dateService', '$location', function(dateService, $location){
var nextTalk = dateService.getNextTalkDate();
$location.path('talks/' + nextTalk.format('MM') + '/' + nextTalk.format('YYYY'));
}]
});
目前,我将controller
配置设置为内联控制器实现,该实现依赖于服务,然后执行此操作并重定向。
然而,感觉有点奇怪,因为我必须将template
设置为某个虚拟值,否则根本不会调用控制器。
感觉好像我正在强调controller
属性,因为它不适合它。
我想应该有办法运行一些可以访问路由服务的视图无关代码。我可以改正自己的$routeProvider
我想但是对于我认为应该内置的东西来说,这似乎有点沉重。
答案 0 :(得分:1)
看起来'/ talks'是一种抽象,因为它刚刚用于重定向到其他路线..那么如何设置这样的路线:
''/会谈/月/:今年的
其中:month和:year是可选的。如果没有给出月份或年份,您的服务将返回默认通话。这可能是下一个话题。如果给出了参数,则只需获取所请求的数据。
因此不需要重定向。现在,您可以指定控制器和所需的视图,并在范围上公开您的数据。可选地,最好将服务调用包装在promise中,并在routeProviders resolve属性中解析它。
这确保只有在一切都解决好后,视图才会改变。
希望有所帮助!
答案 1 :(得分:1)
没有办法将服务注入到路线的任何地方。无论是redirectTo
还是template
,其中的任何代码都在模块级别处理。这意味着首先加载模块,然后当应用程序自我升级时,然后执行服务和注入级代码。所以controller
是你最好的选择(因为这确实支持注射)。
Controller在AngularJS的很多领域都有使用,它应该可以正常运行。您可以像在那里一样处理重定向,也可以设置指向同一控制器的三条不同路由(构建页面的位置)。
var handler = { controller : 'Ctrl' };
$routeProvider.when('/talks', handler).
when('/talks/:month, handler).
when('/talks/:month/:year', handler);
如果你最终使用重定向,那么只需使用$location.path(url).replace()
。这将使历史堆栈跳回一个级别,因此重定向触发URL将不在您的历史记录中。