我的问题是,我需要在调用控制器和呈现模板之前加载一个服务。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>
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;
});
发布于 2012-09-30 08:28:28
你可以使用manual initialization来推迟angular应用的初始化,而不是使用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);
});
});
其中callService
是执行AJAX调用并接受成功回调的函数,它将初始化angular应用程序。
还要检查ngCloak
指令,因为它可能包含了您需要的所有内容。
或者,在使用ngRoute时,您可以使用resolve
属性,因此您可以看到@honkskillet答案
发布于 2013-03-05 02:29:06
甚至比手动引导更好(这也不总是一个坏主意)。
angular.module('myApp', ['app.services'])
.run(function(myservice) {
//stuff here.
});
发布于 2012-10-01 00:15:41
正如我在评论中所说,在控制器中处理卸载状态会容易得多,您可以从$q中受益,从而使这一点变得非常简单:http://jsfiddle.net/g/g75XQ/4/
如果您想在加载用户时在控制器中创建一些内容:http://jsfiddle.net/g/g75XQ/6/
编辑:要延迟路由更改,直到加载了某些数据,请查看以下答案:Delaying AngularJS route change until model loaded to prevent flicker
https://stackoverflow.com/questions/12657389
复制相似问题