如何在有权访问服务的路由上运行代码

时间:2013-03-31 21:54:54

标签: angularjs

我想知道配置路由的最佳方法是什么,其唯一目的是利用服务调用然后重定向。

我正在使用这个黑客:

$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我想但是对于我认为应该内置的东西来说,这似乎有点沉重。

2 个答案:

答案 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将不在您的历史记录中。