基本的前提是.
我有申请。当用户访问应用程序时,它会立即通过ajax调用从sharepoint服务器获取有关用户的各种信息。根据用户接收的数据类型,应用程序必须显示/隐藏某些信息,并设置某些设置。
应用程序中的每个控制器在很大程度上依赖于从此sharepoint服务器返回的数据。
我有几个问题..。
First,应该在哪里进行这个ajax调用?理想情况下,它应该尽快运行,那么它应该在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");
}任何智慧、洞察力或建议都是值得赞赏的!
发布于 2014-05-22 23:32:22
First:
ajax调用的发生取决于几件事,但是由于您提到要推迟加载控制器,直到用户数据被删除,所以最好的选择是将调用放在服务中。在我对你最后一个项目的答复中,会有更多的内容。将这些数据放置在服务中还可以使控制器之间的共享变得更容易,这就引出了下一个要点。
第二版:
您的用户数据绝对应该放在服务中,绝对不应该放在$rootScope中。想想$rootScope,就像在JavaScript中使用window / globals一样。你想要避免在任何事情上使用它。一个例外是您确实需要使用events ($broadcast/$emit/$on),但即使是这样的情况也应该很少见。
终于:
查看用于resolve的$routeProvider选项(如果您喜欢该路由(不打算使用双关语),ui-router也有类似的选项)。
此选项允许您将控制器的实例化推迟到一组承诺得到解决。在这种情况下,您应该从User服务返回一个承诺,一旦检索到用户数据,就会解决这个问题。
为了帮助演示这些要点,我创建了这个简单演示。这段代码,连同指向角度文档的链接,应该足够让你.
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;
});...where beer.html包含:
<div>
My favorite kind of beer is: {{favoriteBeer}}
</div>https://stackoverflow.com/questions/23817900
复制相似问题