然后AngularJS加载服务调用控制器并进行渲染

Jos*_*ssi 21 javascript synchronization sync angularjs

我的问题是我需要在调用控制器并呈现模板之前加载服务. http://jsfiddle.net/g75XQ/2/

HTML:

<div ng-app="app" ng-controller="root">
    <h3>Do not render this before user has loaded</h3>            
    {{user}}
</div>
?
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

angular.module('app', []).
factory('user',function($timeout,$q){
    var user = {};            
    $timeout(function(){//Simulate a request
        user.name = "Jossi";
    },1000);
    return user;
}).
controller('root',function($scope,user){

    alert("Do not alert before user has loaded");
    $scope.user = user;

});
?
Run Code Online (Sandbox Code Playgroud)

vit*_*ore 14

您可以使用手动初始化而不是带ng-app属性的自动初始化来推迟角度应用的初始化.

// define some service that has `$window` injected and read your data from it
angular.service('myService', ['$window', ($window) =>({   
      getData() {
          return $window.myData;
      }
}))    

const callService = (cb) => {
   $.ajax(...).success((data)=>{
         window.myData = data;
         cb(data)
   })
}

// init angular app 
angular.element(document).ready(function() {
       callService(function (data) {
          doSomething(data);
          angular.bootstrap(document);
       });
});
Run Code Online (Sandbox Code Playgroud)

callService你的函数在哪里执行AJAX调用并接受成功回调,这将是init angular app.

还检查ngCloak指令,因为它可能是你需要的一切.

或者,当使用ngRoute时,您可以使用resolve属性,因为您可以看到@honkskillet的答案

  • 不,"run"不是答案,因为它是同步的.手动初始化是我发现的唯一一个解决异步函数的答案,该函数的输出需要在整个应用范围内完成.问题是:如何从初始化函数中解决服务的属性,以便您可以将异步调用的输出存储在除全局变量之外的其他内容中? (3认同)

dav*_*son 9

甚至比手动引导更好(这也不总是一个坏主意).

angular.module('myApp', ['app.services'])
   .run(function(myservice) {
      //stuff here.
   });
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于任何异步调用.如果用户在应用程序中的某个位置点击F5,该服务很可能会在尝试获取数据时击败app.run,从而导致错误.AngularJS迫切需要一个通用的解决方案,一个阻止任何控制器执行直到其promise返回的解决方案.这对于绝对必要的应用程序范围的数据来说是完美的. (7认同)
  • 是否有可能延迟应用程序,直到运行返回的承诺被解决或拒绝? (6认同)