如何将全局异步数据存储/传递给控制器

时间:2014-05-22 22:11:46

标签: javascript angularjs angularjs-scope angularjs-controller

基本前提是......

我有一个申请。当用户点击应用程序时,它立即通过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");
}

感谢任何智慧,见解或建议!

1 个答案:

答案 0 :(得分:1)

<强>首先

当您的ajax呼叫发生时,取决于一些事情,但由于您提到您希望推迟控制器加载,直到用户数据被拉下来,您最好的选择是将呼叫置于您的服务中。更多关于我对你上一个项目的回复。将这些数据放置在服务中也可以更容易地在控制器之间共享,这将我们带到下一点......

<强>第二

您的用户数据进入服务,绝对不应进入$rootScope。想象$rootScope就像在JavaScript中做window / globals一样。你想避免在任何事情上使用它。例外情况是您真正需要使用事件($broadcast / $emit / $on),但即使这些情况也很少见。

<强>最后:

查看$routeProviderresolve选项(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>