如何在没有templateUrl的情况下路由?

时间:2013-01-19 06:20:06

标签: url angularjs logout

确定。我有一个网址设置来记录用户。在服务器上,没有html。服务器上的会话只是被破坏,然后用户被重定向到一个地址。

这适用于普通的html,但是对于Angular,我遇到了问题。我一直在使用$routeProvider.when('/foo', {templateUrl: '/foo.html', controller: 'Ctrl'})路由所有主要路由,这对于正常的模板化路由很好。但是,如果没有模板,它将无法工作。

那么,当没有html模板时,我如何以与上面相同的方式支持路由/logout

2 个答案:

答案 0 :(得分:59)

解决方法是使用template代替templateUrl。来自Angular docs

  

template - {string =} - html模板作为应该使用的字符串   通过ngView或ngInclude指令。此属性优先于   templateUrl。

可以使用如下:

$routeProvider.when("/foo", {template: " ", controller: "Ctrl"});

注意:您必须使用" "而不是空字符串"",因为Angular在触发控制器之前使用if (template)检查,而空字符串的计算结果为false。

- 编辑 -

更好的方法是使用resolve地图。请参阅Angular Docs

  

resolve - {Object。=} - 可选的地图   应该注入控制器的依赖项。

可以这样使用:

$routeProvider.when('/foo', {resolve: {redirect: 'RedirectService'}});

注意:我已经将它从“Ctrl”更改为“RedirectService”,因为您在问题中描述的内容并不是Angular意义上的“控制器”。它没有为视图设置范围。相反,它更像是一种服务,最终会重定向。

答案 1 :(得分:9)

我正在根据已经接受的答案和其评论中提到的github问题编写解决方案。

我使用的方法是resolve中的$routeProvider参数。在我的情况下,我试图在我的应用程序中创建一个很好的解决方案 logout ,当用户转到 / logout 时。

$routeProvider的示例代码:

app.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.
        ...
        when('/logout', {
            resolve: {
                logout: ['logoutService', function (logoutService) {
                    logoutService();
                }]
            },
        }).
        ...
}]);

在解决方案部分,您可以按名称指定服务(工厂),稍后必须调用它。它仍然是最好的解决方案。

为了让示例完整,我展示了我的logoutService

angular.module('xxx').factory('logoutService', function ($location, Auth) {
    return function () {
       Auth.setUser(undefined);
       $location.path('/');
    }
});

效果很好!