Javascript 路由器解析将不会注入控制器
我已经尽了一切努力来获得ui路由器的解析,将其值传递给给定的控制器——AppCtrl。我将依赖项注入与Javascript 路由器解析将不会注入控制器,javascript,angularjs,angular-ui-router,angularjs-service,Javascript,Angularjs,Angular Ui Router,Angularjs Service,我已经尽了一切努力来获得ui路由器的解析,将其值传递给给定的控制器——AppCtrl。我将依赖项注入与$inject一起使用,这似乎导致了问题。我错过了什么 路由 $stateProvider.state('app.index', { url: '/me', templateUrl: '/includes/app/me.jade', controller: 'AppCtrl', controllerAs: 'vm', resolve: { auser: ['User'
$inject
一起使用,这似乎导致了问题。我错过了什么
路由
$stateProvider.state('app.index', {
url: '/me',
templateUrl: '/includes/app/me.jade',
controller: 'AppCtrl',
controllerAs: 'vm',
resolve: {
auser: ['User', function(User) {
return User.getUser().then(function(user) {
return user;
});
}],
}
});
控制器
appControllers.controller('AppCtrl', AppCtrl);
AppCtrl.$inject = ['$scope', '$rootScope'];
function AppCtrl($scope, $rootScope, auser) {
var vm = this;
console.log(auser); // undefined
...
}
编辑
这里有一个plunk当您在绑定到路由的控制器中使用路由解析参数作为依赖项注入时,您不能将该控制器与ng控制器指令一起使用,因为名为
aname
的服务提供商不存在。当路由器在其各自的部分视图中实例化要绑定的控制器时,它会注入一个动态依赖项
另外,请记住在您的示例中返回$timeout
,因为它返回一个承诺,否则您的参数将被解析为无值,如果您使用$http
或其他返回承诺的服务,情况也是如此
i、 e
在控制器中,注入解析依赖项
appControllers.controller('AppCtrl', AppCtrl);
AppCtrl.$inject = ['$scope', '$rootScope','auser']; //Inject auser here
function AppCtrl($scope, $rootScope, auser) {
var vm = this;
vm.user = auser;
}
在视图中而不是ng控制器中,使用ui视图
指令:
<div ui-view></div>
以下是我如何使用resolve。它应该得到承诺。所以我创建了相应的服务
app.factory('User', function($http){
var user = {};
return {
resolve: function() {
return $http.get('api/user/1').success(function(data){
user = data;
});
},
get: function() {
return user;
}
}
});
这是主要思想。您也可以使用$q
app.factory('User', function($q, $http){
var user = {};
var defer = $q.defer();
$http.get('api/user/1').success(function(data){
user = data;
defer.resolve();
}).error(function(){
defer.reject();
});
return {
resolve: function() {
return defer.promise;
},
get: function() {
return user;
}
}
});
这些在实际操作中几乎相同。区别在于,在第一种情况下,服务将在调用服务的resolve()
方法时开始提取日期,在第二个示例中,它将在创建factory对象时开始提取日期
现在在你的州
$stateProvider.state('app.index', {
url: '/me',
templateUrl: '/includes/app/me.jade',
controller: function ($scope, $rootScope, User) {
$scope.user = User.get();
console.log($scope.user);
},
controllerAs: 'vm',
resolve: {
auser: function(User) {
return User.resolve()
}
}
});
您是否错过了注射
auser
<代码>AppCtrl.$inject=['$scope','$rootScope','auser']代码>注入auser
会导致[$injector:unpr]
错误:(您不能提供ng控制器,您需要使用route Only Great input设置它!它可以工作:D您想作为答案发布吗?此评论“//Injection auser here”刚刚解决了我2小时的研究问题!!谢谢
$stateProvider.state('app.index', {
url: '/me',
templateUrl: '/includes/app/me.jade',
controller: function ($scope, $rootScope, User) {
$scope.user = User.get();
console.log($scope.user);
},
controllerAs: 'vm',
resolve: {
auser: function(User) {
return User.resolve()
}
}
});