30

行。我有一个 url 设置来注销用户。在服务器上,没有 html。服务器上的会话简单地被破坏,然后用户被重定向到一个地址。

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

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

4

2 回答 2

59

一种解决方法是使用template而不是templateUrl. 来自Angular 文档

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

这可以按如下方式使用:

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

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

- 编辑 -

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

resolve - {Object.=} - 一个可选的依赖关系映射,应该注入到控制器中。

这可以像这样使用:

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

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

于 2013-01-19T07:16:06.423 回答
9

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


我使用的方法resolve$routeProvider. 就我而言,当用户转到/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('/');
    }
});

效果很好!

于 2015-07-23T12:54:11.030 回答