使用angular ngRoute
,我将请求路由到不同的视图/控制器。我想利用这个功能延迟完成一条路线,直到完成一些先决条件的期货。
我使用以下语法:
$routeProvider
.when('/users', {
templateUrl: 'user-view.html',
controller: 'UserController',
controllerAs: 'vm',
resolve: {
users: function(userDataService) {
// returns a future
return userDataService.loadUsers();
}
}
})
这是一个简单的用例,我们只需要UserDataService
加载users
的值,然后再将其传递给控制器的构造函数。一切都好。
实际上,我的控制器初始化要比这复杂得多。而是将users
注入控制器,而是注入UserDataService
并在UserController.init()
中完成初始化。
这段代码说明了我的愿望:
angular.controller('UserController', ['UserDataService', function(userDataService) {
this.userDataService = userDataService;
this.users = [];
this.currentUser = null
this.otherUsersInMyGroup = [];
this.supervisedUsers = [];
this.init() {
// Return a "joined" promise that aggregates each promise
return $q.all([
this.userDataService.loadUsers()
.then(function (u) { this.users = u }.bind(this)),
this.userDataService.getCurrentUser()
.then(function (u) { this.currentUser = u }.bind(this)),
// ... Other load promises for other members
]);
}
return this;
}]);
这意味着我现在需要能够延迟路由完成,直到UserController.init()
方法完成。
这如何与路由器中的resolve
方法兼容?
鉴于resolve
功能旨在为控制器的构造函数提供参数,它有点像鸡蛋和鸡蛋的情况......控制器必须在我能够创建之前创建调用controller.init()
,但在创建控制器之前评估解析方法,因此可能会忽略构造函数参数。