Javascript 如何将全局异步数据存储/通信到控制器
基本前提是 我有一份申请。当用户点击应用程序时,它立即通过ajax调用从sharepoint服务器获取有关用户的各种信息。根据从用户接收到的数据类型,应用程序必须显示/隐藏某些信息并设置某些设置 应用程序中的每个控制器都严重依赖于此sharepoint服务器返回的数据 我有几个问题 首先,这个ajax调用应该在哪里进行?理想情况下,它应该尽快运行,也应该在Javascript 如何将全局异步数据存储/通信到控制器,javascript,angularjs,angularjs-scope,angularjs-controller,Javascript,Angularjs,Angularjs Scope,Angularjs Controller,基本前提是 我有一份申请。当用户点击应用程序时,它立即通过ajax调用从sharepoint服务器获取有关用户的各种信息。根据从用户接收到的数据类型,应用程序必须显示/隐藏某些信息并设置某些设置 应用程序中的每个控制器都严重依赖于此sharepoint服务器返回的数据 我有几个问题 首先,这个ajax调用应该在哪里进行?理想情况下,它应该尽快运行,也应该在app.run()中执行吗 第二个,从sharepoint服务器返回的数据应该存储在哪里?我读到,创建一个只用于存储数据的工厂不是最佳实践,最
app.run()
中执行吗
第二个,从sharepoint服务器返回的数据应该存储在哪里?我读到,创建一个只用于存储数据的工厂不是最佳实践,最好只使用$rootscope
。现在,我只是将一个User
对象存储在一个工厂调用“User”
中,事后看来,我猜这是一个不允许的
最后,我不确定是否有方法暂停控制器的加载,因为它们严重依赖于返回的数据,但如果没有,如何将接收到的信息传达给控制器。使用$broadcast
方法是否会出现这种情况
现在,我有一种黑客的解决方案。它完成了任务,但我敢肯定它不太理想
这是一个控制器的一部分。我正在将工厂用户注入其中
if (User.HasLoadedUserProps == false)
{
User.registerObserverCallback(hasLoadedProperties);
User.GetUser("1111");
}
else
{
if (User.IsAdmin == true)
//do whatever
}
一旦从ajax调用返回了必要的信息,它就会调用
var hasLoadedProperties = function ()
{
if (User.IsAdmin == true)
//do whatever
else
utilities.popupBox("You do not have permission to view this page", "Access Denied");
}
任何智慧、见解或建议都将不胜感激 首先: ajax调用何时发生取决于几件事,但由于您提到希望推迟控制器加载,直到用户数据被拉下来,所以最好的办法是将调用放入您的服务中。在我对你的最后一个问题的回答中有更多的内容。将数据放在服务中还可以更容易地在控制器之间共享,这将我们带到下一点 秒: 您的用户数据绝对应该放在服务中,绝对不应该放在
$rootScope
中。想象一下JavaScript中的$rootScope
窗口/globals。你想避免在很多事情上使用它。例外情况是您确实需要使用事件($broadcast
/$emit
/$on
),但即使是这种情况也应该很少发生
最后:
查看的resolve
选项(如果您喜欢该路线,也有类似的选项(没有双关语)
此选项允许您延迟控制器的实例化,直到一组承诺得到解决。在您的情况下,您应该从用户
服务返回一个承诺,该承诺在检索到用户数据后得到解决
为了帮助演示这些要点,我做了这个。这段代码,连同到Angular文档的链接,应该足以让您继续
angular.module('myApp', ['ngRoute'])
.config(function($routeProvider) {
$routeProvider.when('/', {
templateUrl: 'beer.html',
controller: 'BeerController',
resolve: {
beer: function(Beer){ //injected into controller once promise is resolved
return Beer.getFavorite();
}
}
})
})
.controller('BeerController', function($scope, beer) { // Will load after 3s
$scope.favoriteBeer = beer; // beer comes from resolve in $routeProvider
})
.factory('Beer', function($timeout) {
var beer = {
favorite: 'porter'
};
beer.getFavorite = function() {
return $timeout(function() { // pretend this is an ajax call
return beer.favorite;
}, 3000);
}
return beer;
});
…其中beer.html
包含:
<div>
My favorite kind of beer is: {{favoriteBeer}}
</div>
我最喜欢的啤酒是:{{favoriteBeer}}
谢谢你。这肯定让我走上了正轨