我想延迟控制器的初始化,直到从服务器到达必要的数据。
我找到了Angular 1.0.1的这个解决方案:Delaying AngularJS route change until model loaded to prevent flicker,但是无法使用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
});
});
答案 0 :(得分:11)
由于$ http返回一个promise,因此创建你自己的deferred只是为了在http数据到达时返回promise。你应该能够做到:
MyCtrl.resolve = {
datasets: function ($http) {
return $http({method: 'GET', url: '/someUrl'});
}
};
如果您需要对结果进行一些处理,请使用.then,您的承诺将被免费链接:
MyCtrl.resolve = {
datasets: function ($http) {
return $http({method: 'GET', url: '/someUrl'})
.then (function (data) {
return frob (data);
});
}
};
答案 1 :(得分:4)
您可以随时将“ng-show”放在最外层的DOM元素上,并将其设置为您想要等待的数据。
对于Angular JS主页上列出的示例,您可以看到它是多么容易:http://plnkr.co/CQu8QB94Ra687IK6KgHn 所有必须做的就是 这样,在设置该值之前,表单才会显示。
这种方式更直观,更少工作。
答案 2 :(得分:1)
您可以查看使用资源的几乎相同的问题here,但它与$ http的工作方式相同。我认为这应该有用
function MyCtrl($scope, datasets) {
$scope.datasets = datasets;
}
MyCtrl.resolve = {
datasets: function($http, $q) {
var deferred = $q.defer();
$http({method: 'GET', url: '/someUrl'})
.success(function(data) {
deferred.resolve(data)
}
return deferred.promise;
}
};
var myApp = angular.module('myApp', [], function($routeProvider) {
$routeProvider.when('/', {
templateUrl: '/editor-tpl.html',
controller: MyCtrl,
resolve: MyCtrl.resolve
});
});