如何全局解析依赖项(从服务器预加载当前用户)
How to globally resolve a dependency (preload current user from server)
我知道我可以根据路由解决控制器的某些依赖关系。但是,我有一个我一直想要解决的服务:当前用户。
该服务基本上为当前用户向服务器发出 get 请求(url 类似于 /api/user/me
),并返回一个包含用户 ID、名称等的对象。它目前被缓存并返回 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.
一种选择是让它完成。 您的服务可以具有用户属性,您可以根据需要绑定到该属性。 这就像在服务填充信息之前将所有内容视为未经身份验证的用户。
如果在生成页面时它可用,为什么不将其包含在 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>
您正在使用$http所以我将使用拦截器解决此问题。
摘自 angularjs 文档部分拦截器 http://docs.angularjs.org/api/ng.$http
用于全局错误处理、身份验证或任何类型的 请求的同步或异步预处理或 响应的后处理,希望能够拦截 请求在传递给服务器之前,在之前响应 它们被移交给启动这些内容的应用程序代码 请求。拦截器利用承诺 API 来实现这一点 需要同步和异步预处理。
您可以从以下内容开始: http://plnkr.co/edit/td0jyy3j3rTAx1mZifjy?p=preview您需要在本地服务器上测试此代码,并将服务器配置为发送 401 未授权响应。
- Rails:如何向用户预加载消息
- 强制用户重新加载页面
- 防止用户在jQuery Mobile中ajax加载页面时单击其他位置
- 如果图像标记是用javascript编写的,并且需要用户输入,那么图像不会随页面加载吗
- 如何知道用户已经重新加载了网页,使用jquery.如果用户重新加载网页,
- 基于用户加载不同的controller/js文件'访问级别
- 如何只重新加载用户脚本,即不重新加载页面
- 当用户到达页面右侧时加载新内容
- 调用按钮单击事件 ajax 加载的用户控件
- 根据用户屏幕大小加载 JS 或 PHP
- 如何在用户提交后退按钮时重新加载同一页面
- 如何加载用户列表并并行呈现它们
- HTML5 localStorage加载用户输入变量
- HTML加载用户单击按钮时输入的输入字段数
- 单击加载用户语音API
- 如何在CMS中重新加载用户定义的标签变得简单
- 在AngularJS中,在控制器之前加载用户上下文
- 动态加载用户控件在ie11和Chrome中不工作
- 在JSP页面上加载用户帖子
- 在网页上加载用户选择的图像