我知道我可以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.
答案 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响应。