ejecutar - llamar funcion javascript html sin evento
La resolución del enrutador no se inyectará en el controlador (2)
Así es como trabajo con resolución. Debería recibir una promesa. Entonces creo servicio en consecuencia.
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;
}
}
});
Esta es la idea principal. También puedes hacer algo como esto con $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;
}
}
});
Estos son casi idénticos en acción. La diferencia es que, en el primer caso, el servicio comenzará a recuperar la fecha cuando llame al método de servicio resolve()
y, en el segundo ejemplo, comenzará a recuperar cuando se cree un objeto de fábrica.
Ahora en tu estado.
$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()
}
}
});
He intentado todo para obtener la resolución de ui-enrutador para pasar su valor al controlador dado-AppCtrl. Estoy usando la inyección de dependencia con $inject
, y eso parece causar los problemas. ¿Qué me estoy perdiendo?
Enrutamiento
$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;
});
}],
}
});
Controlador
appControllers.controller(''AppCtrl'', AppCtrl);
AppCtrl.$inject = [''$scope'', ''$rootScope''];
function AppCtrl($scope, $rootScope, auser) {
var vm = this;
console.log(auser); // undefined
...
}
Editar Aquí hay un plunk http://plnkr.co/edit/PoCiEnh64hR4XM24aH33?p=preview
Cuando utiliza el argumento de resolución de ruta como inyección de dependencia en el controlador vinculado a la ruta, no puede usar ese controlador con la directiva ng-controller porque el proveedor de servicios con el nombre aname
no existe. Es una dependencia dinámica que el enrutador inyecta cuando crea una instancia del controlador para que se vincule en su respectiva vista parcial.
Recuerde también devolver $timeout
en su ejemplo, porque devuelve una promesa; de lo contrario, su argumento se resolverá sin ningún valor, tal es el caso si usa $http
u otro servicio que devuelva una promesa.
es decir
resolve: {
auser: [''$timeout'', function($timeout) {
return $timeout(function() {
return {name:''me''}
}, 1000);
}],
En el controlador, inyecta la dependencia de resolución.
appControllers.controller(''AppCtrl'', AppCtrl);
AppCtrl.$inject = [''$scope'', ''$rootScope'',''auser'']; //Inject auser here
function AppCtrl($scope, $rootScope, auser) {
var vm = this;
vm.user = auser;
}
en la vista en lugar de ng-controller, use la directiva ui-view
:
<div ui-view></div>