1

我知道我可以根据路由解决控制器的某些依赖关系。但是,我有一个我一直想解决的服务:当前用户。

该服务基本上为当前用户(url类似于/api/user/me)向服务器发出一个get请求,并返回一个带有用户ID、名称等的对象。这当前被缓存并返回承诺,所以无论我想在哪里使用它,我都必须做类似的事情:

CurrentUser.getCurrentUser().then(function(user) {
    // use user.id here
});

为已加载的数据创建额外的、不必要的嵌套和回调层。有没有一种好方法可以全局预加载用户,以便我可以在任何地方使用它而无需等待承诺?

沿着我上面链接的路线解决方案,除了它应该适用于所有路线和可能的服务。

我画出这样的结果:

// somewhere
AlwaysResolveThisBeforeDoingSomething(UserService.resolve);

// In my controller
.controller('CurrentUserCtrl', function ($scope, $http, CurrentUser) {
    // CurrentUser is an initialized user containing id, name etc.
4

2 回答 2

0

您正在使用 $http 所以我会使用拦截器来解决这个问题。

取自 angularjs 文档部分拦截器http://docs.angularjs.org/api/ng.$http

出于全局错误处理、身份验证或任何类型的请求的同步或异步预处理或响应的后处理的目的,希望能够在请求被移交给服务器之前拦截请求并在响应被移交给之前拦截它们启动这些请求的应用程序代码。拦截器利用 Promise API 来满足同步和异步预处理的需求。

您可以从以下内容开始:http ://plnkr.co/edit/td0jyy3j3rTAx1mZifjy?p=preview 您需要在本地服务器上测试此代码并将服务器配置为发送 401 Unauthorized 响应。

于 2013-10-27T16:05:14.543 回答
0

一种选择是让它完成。您的服务可以有一个用户属性,您可以根据需要绑定到该属性。这就像在服务填充信息之前将所有内容视为用户未经身份验证一样。

如果它在您生成页面时可用,为什么不将它包含在 HTML 中或作为<SCRIPT>标签?在 ASP.NET MVC 中,您可以这样做:

public ActionResult UserScript()
{
    var user = new { 
        id = 1,
        name = "jason"
    };
    string s = string.format("var my = {{ user: {0} }};", 
            JsonConvert.SerializeObject(user));
    return JavaScript(s);
}

并且它将以与页面上任何脚本相同的顺序加载,具体取决于您放置它的位置,但您可以将它放在脚本之后,因为在角度引导之前该值无关紧要。这里我只是简单地设置了值,但您可以将其作为服务的一部分。

<div ng-app ng-controller="MyCtrl">
    <script type="text/javascript">
        function MyCtrl($scope) {
            $scope.user = my.user;
        }
    </script>
    <h3>You are: {{user.name}}</h3>
</div>
<script type="text/javascript" src="@Url.Action("UserScript", "Test")"></script>
于 2013-10-27T16:04:22.840 回答