如何全局解析依赖关系(从服务器预加载当前用户)

时间:2013-10-27 14:49:33

标签: javascript angularjs angularjs-service angularjs-routing

我知道我可以resolve certain dependencies根据路线获得控制器。但是,我有一个总是想要解决的服务:当前用户。

该服务基本上为当前用户向服务器发出get请求(url类似于/api/user/me)并返回一个带有userid,name等的对象。这个目前是缓存的,并带有promises返回,所以到处都是我想用它我必须做的事情:

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.

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

  

出于全局错误处理,身份验证或任何类型的目的   请求或的同步或异步预处理   对响应进行后处理,希望能够进行拦截   在将它们交给服务器和响应之前请求   它们被移交给发起这些的应用程序代码   要求。拦截器利用promise API来实现这一目标   需要同步和异步预处理。

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