问题描述
我想延迟控制器的初始化直至必要的数据已经从服务器到达
I would like to delay the initialization of a controller until the necessary data has arrived from the server.
我发现这个解决方案的角度1.0.1:,但无法得到它与角1.1.0工作
I found this solution for Angular 1.0.1: Delaying AngularJS route change until model loaded to prevent flicker, but couldn't get it working with Angular 1.1.0
模板
<script type="text/ng-template" id="/editor-tpl.html">
Editor Template {{datasets}}
</script>
<div ng-view>
</div>
的JavaScript
function MyCtrl($scope) {
$scope.datasets = "initial value";
}
MyCtrl.resolve = {
datasets : function($q, $http, $location) {
var deferred = $q.defer();
//use setTimeout instead of $http.get to simulate waiting for reply from server
setTimeout(function(){
console.log("whatever");
deferred.resolve("updated value");
}, 2000);
return deferred.promise;
}
};
var myApp = angular.module('myApp', [], function($routeProvider) {
$routeProvider.when('/', {
templateUrl: '/editor-tpl.html',
controller: MyCtrl,
resolve: MyCtrl.resolve
});
});
推荐答案
由于$ HTTP返回一个承诺,这是一个性能命中创建自己的延期只是当HTTP数据到达返回的承诺。你应该能够做到:
Since $http returns a promise, it's a performance hit to create your own deferred just to return the promise when the http data arrives. You should be able to do:
MyCtrl.resolve = {
datasets: function ($http) {
return $http({method: 'GET', url: '/someUrl'});
}
};
如果你需要做的结果的一些处理,使用。于是,和你的承诺被链接在免费:
If you need to do some processing of the result, use .then, and your promise is chained in for free:
MyCtrl.resolve = {
datasets: function ($http) {
return $http({method: 'GET', url: '/someUrl'})
.then (function (data) {
return frob (data);
});
}
};
这篇关于Angular.js延迟控制器初始化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!