如何在AngularJS的运行块中等待承诺?
我真的需要在引导之前加载一些数据。由于这个原因,我创建了一个如何在AngularJS的运行块中等待承诺?,angularjs,Angularjs,我真的需要在引导之前加载一些数据。由于这个原因,我创建了一个run块/在这个run块中,我调用了一个从服务器加载一些数据的服务方法。由于这是一个异步调用,JavaScript的执行会更进一步,这会导致我的应用程序中出现一些未定义的对象 我正在使用routes,但不能使用resolve属性 是否有人能提供一个解决方案,说明如何在运行块中等待承诺就绪 编辑: 由于给出了答案,我通过手动引导解决了这个问题: $(document).ready(function () { $.ajax('/Da
run
块/在这个run
块中,我调用了一个从服务器加载一些数据的服务方法。由于这是一个异步调用,JavaScript的执行会更进一步,这会导致我的应用程序中出现一些未定义的对象
我正在使用routes,但不能使用resolve
属性
是否有人能提供一个解决方案,说明如何在运行
块中等待承诺就绪
编辑:
由于给出了答案,我通过手动引导解决了这个问题:
$(document).ready(function () {
$.ajax('/Data/GetDropdownData', {type:'POST'}).done(function (response) {
app.run(['ListService', function (ListService) {
ListService.setData(response);
}])
angular.bootstrap(document, ["sma"]);
})
})
正如我所评论的,我会把它放在这里 你可以试试
元素(文档).ready(函数(){
角度引导(文档);
});
当然,在这种情况下,您不能使用控制器和角度方式获取数据。我认为您必须通过jQuery加载数据,在jQuery回调中引导angular,然后使用从jQuery获得的数据初始化scope变量 我想唯一的解决方案就是你的应用程序。也许你可以在这个问题和这篇小文章中找到一些帮助 如前一篇文章所述,要进行手动引导:
angular.element(document).ready(function() {
angular.bootstrap(document, ["myApp"]);
});
请务必删除HTML
中ng app
的所有引用,以停止自动引导。您可能想看看这个问题-它显示了如何使用异步数据初始化AngularJS服务
是该问题中的一个plunkr示例,展示了如何使用AngularJS服务(如$http)加载配置,然后进行进一步初始化
答案有一个很好的解释,并展示了一个等待DOM加载的示例(该答案中的plunkr示例为):
另一个解决方案是,我不会对应用程序的某些部分进行ommit,但我仍然必须等待加载 引导指令(不属于twitter引导):
myApp.directive('myBootstrap',function(){
返回{
范围:{
承诺:'=myBootstrap'
},
模板:“”,
controllerAs:“ctrl”,
是的,
控制器:功能($scope){
var ctrl=this;
ctrl.isReady=false;
//否则,一系列承诺可以由一个服务来实现
$scope.promise.then(函数(){
ctrl.isReady=true;
});
}
};
});
以及相关的plnkr:promise.then(函数(数据){$rootScope.data=data;});但我认为这太容易了,而且你也不确定自己是否准备好了controller@Whisher谢谢你的回复,但这确实不是一个选择。我真的需要在启动应用程序之前加载数据。因此,手动引导可能是一个选项angular.element(document).ready(function(){angular.bootstrap(document);});是的,正如@FedorSkrynnikov所说,手动引导是我想要的方式go@FedorSkrynnikov:谢谢您的评论,但是我应该将加载数据的代码放在哪里?标记为“应答”,因为Fedor是第一个。
angular.element(document).ready(function() {
angular.bootstrap(document, ["myApp"]);
});
angular.element(document).ready(function() {
angular.bootstrap(document);
});
myApp.directive('myBootstrap', function() {
return {
scope: {
promise: '=myBootstrap'
},
template: '<div ng-if="ctrl.isReady" ng-transclude></div>',
controllerAs: "ctrl",
transclude: true,
controller: function($scope) {
var ctrl = this;
ctrl.isReady = false;
//else an array of promises can be filled by a service
$scope.promise.then(function() {
ctrl.isReady = true;
});
}
};
});