基本前提是......
我有一个申请。当用户点击应用程序时,它立即通过ajax调用从sharepoint服务器获取有关用户的各种信息。并且根据从用户接收的数据类型,应用程序必须显示/隐藏某些信息并设置某些设置。
应用程序中的每个控制器都严重依赖于从此sharepoint服务器返回的数据。
我有几个问题......
首先,应该在哪里调用ajax?理想情况下它应该尽快运行,所以它应该在app.run()
中执行吗?
第二,应该在哪里存储从sharepoint服务器返回的数据?我读到,为了存储数据而制作工厂不是最佳做法,最好只使用$rootscope
。现在,我只是在工厂调用User
中存储一个"User"
对象,事后我猜是不是没有
最后,我不确定是否有办法暂停加载控制器,因为它们在返回的数据上严重依赖于此,但如果没有&# 39; t,如何将收到的信息传达给控制器。这是使用$broadcast
方法的情况吗?
现在我有一种hackish解决方案。它完成了工作,但我很确定它不太理想
这是一个控制器的一部分。我正在将工厂用户注入其中
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");
}
感谢任何智慧,见解或建议!
答案 0 :(得分:1)
<强>首先强>
当您的ajax呼叫发生时,取决于一些事情,但由于您提到您希望推迟控制器加载,直到用户数据被拉下来,您最好的选择是将呼叫置于您的服务中。更多关于我对你上一个项目的回复。将这些数据放置在服务中也可以更容易地在控制器之间共享,这将我们带到下一点......
<强>第二强>
您的用户数据应进入服务,绝对不应进入$rootScope
。想象$rootScope
就像在JavaScript中做window
/ globals一样。你想避免在任何事情上使用它。例外情况是您真正需要使用事件($broadcast
/ $emit
/ $on
),但即使这些情况也很少见。
<强>最后:强>
查看$routeProvider
的resolve
选项(ui-router
有类似的选项,如果你更喜欢这条路线(没有双关语)。
此选项允许您推迟控制器的实例化,直到解决了一组promise。在您的情况下,您应该从User
服务返回一个承诺,该承诺会在检索到用户数据后得到解决。
为了帮助证明这些观点,我做了simple demo。此代码以及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>