Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将全局异步数据存储/通信到控制器_Javascript_Angularjs_Angularjs Scope_Angularjs Controller - Fatal编程技术网

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

Javascript 如何将全局异步数据存储/通信到控制器,javascript,angularjs,angularjs-scope,angularjs-controller,Javascript,Angularjs,Angularjs Scope,Angularjs Controller,基本前提是 我有一份申请。当用户点击应用程序时,它立即通过ajax调用从sharepoint服务器获取有关用户的各种信息。根据从用户接收到的数据类型,应用程序必须显示/隐藏某些信息并设置某些设置 应用程序中的每个控制器都严重依赖于此sharepoint服务器返回的数据 我有几个问题 首先,这个ajax调用应该在哪里进行?理想情况下,它应该尽快运行,也应该在app.run()中执行吗 第二个,从sharepoint服务器返回的数据应该存储在哪里?我读到,创建一个只用于存储数据的工厂不是最佳实践,最

基本前提是

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

应用程序中的每个控制器都严重依赖于此sharepoint服务器返回的数据

我有几个问题

首先,这个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");
}

任何智慧、见解或建议都将不胜感激

首先:

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}}

谢谢你。这肯定让我走上了正轨