首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将全局异步数据存储/通信给控制器

如何将全局异步数据存储/通信给控制器
EN

Stack Overflow用户
提问于 2014-05-22 22:11:45
回答 1查看 65关注 0票数 1

基本的前提是.

我有申请。当用户访问应用程序时,它会立即通过ajax调用从sharepoint服务器获取有关用户的各种信息。根据用户接收的数据类型,应用程序必须显示/隐藏某些信息,并设置某些设置。

应用程序中的每个控制器在很大程度上依赖于从此sharepoint服务器返回的数据。

我有几个问题..。

First,应该在哪里进行这个ajax调用?理想情况下,它应该尽快运行,那么它应该在app.run()中执行吗?

第二个,从sharepoint服务器返回的数据应该存储在哪里?我读到,仅仅为了存储数据的目的而创建一个工厂并不是最好的实践,最好只是使用$rootscope。现在,我只是将一个User对象存储在一个名为"User"的工厂中,事后看来,我认为它是不可以的。

最后,,我不确定是否有办法暂停加载控制器,因为控制器在很大程度上依赖于返回的数据,但如果没有,如何将接收到的信息传递给控制器。这会是使用$broadcast方法的情况吗?

现在我有一种老套的解决办法。它完成了任务,但我很确定它并不理想

这里是一个控制器的一部分。我正在将工厂用户注入其中。

代码语言:javascript
复制
if (User.HasLoadedUserProps == false)
{
    User.registerObserverCallback(hasLoadedProperties);
    User.GetUser("1111");
}
else
{
    if (User.IsAdmin == true)
        //do whatever
}

一旦从ajax调用返回了必要的信息,它就调用如下

代码语言:javascript
复制
var hasLoadedProperties = function ()
{
    if (User.IsAdmin == true)
        //do whatever
    else
        utilities.popupBox("You do not have permission to view this page", "Access Denied");
}

任何智慧、洞察力或建议都是值得赞赏的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-22 23:32:22

First:

ajax调用的发生取决于几件事,但是由于您提到要推迟加载控制器,直到用户数据被删除,所以最好的选择是将调用放在服务中。在我对你最后一个项目的答复中,会有更多的内容。将这些数据放置在服务中还可以使控制器之间的共享变得更容易,这就引出了下一个要点。

第二版:

您的用户数据绝对应该放在服务中,绝对不应该放在$rootScope中。想想$rootScope,就像在JavaScript中使用window / globals一样。你想要避免在任何事情上使用它。一个例外是您确实需要使用events ($broadcast/$emit/$on),但即使是这样的情况也应该很少见。

终于:

查看用于resolve$routeProvider选项(如果您喜欢该路由(不打算使用双关语),ui-router也有类似的选项)。

此选项允许您将控制器的实例化推迟到一组承诺得到解决。在这种情况下,您应该从User服务返回一个承诺,一旦检索到用户数据,就会解决这个问题。

为了帮助演示这些要点,我创建了这个简单演示。这段代码,连同指向角度文档的链接,应该足够让你.

代码语言:javascript
复制
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包含:

代码语言:javascript
复制
<div>
  My favorite kind of beer is: {{favoriteBeer}}
</div>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23817900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档