Je souhaite afficher un formulaire avec les données correspondant à l'élément modifié. J'utilise ui-router
pour le routage. J'ai défini un état:
myapp.config(function($stateProvider) {
$stateProvider.
.state('layout.propertyedit', {
url: "/properties/:propertyId",
views : {
"contentView@": {
templateUrl : 'partials/content2.html',
controller: 'PropertyController'
}
}
});
Dans PropertyController
, je souhaite définir $scope.property
avec les données provenant de l'appel suivant (points de terminaison Google Cloud):
gapi.client.realestate.get(propertyId).execute(function(resp) {
console.log(resp);
});
Je ne sais pas si je peux utiliser resolve
car les données sont renvoyées de manière asynchrone. j'ai essayé
resolve: {
propertyData: function() {
return gapi.client.realestate.get(propertyId).execute(function(resp) {
console.log(resp);
});
}
}
Premier numéro, la propertyId
est indéfinie. Comment obtenez-vous la propertyId
à partir du url: "/properties/:propertyId"
?
En gros, je veux définir $scope.property
dans PropertyController
à l'objet resp
renvoyé par l'appel asynchrone.
MODIFIER:
myapp.controller('PropertyController', function($scope, , $stateParams, $q) {
$scope.property = {};
$scope.create = function(property) {
}
$scope.update = function(property) {
}
function loadData() {
var deferred = $q.defer();
gapi.client.realestate.get({'id': '11'}).execute(function(resp) {
deferred.resolve(resp);
});
$scope.property = deferred.promise;
}
});
Vous devez lire les docs pour résoudre . Les fonctions de résolution sont injectables, et vous pouvez utiliser $stateParams
pour obtenir la valeur correcte de vos routes, comme ceci:
resolve: {
propertyData: function($stateParams, $q) {
// The gapi.client.realestate object should really be wrapped in an
// injectable service for testability...
var deferred = $q.defer();
gapi.client.realestate.get($stateParams.propertyId).execute(function(r) {
deferred.resolve(r);
});
return deferred.promise;
}
}
Enfin, les valeurs des fonctions de résolution sont injectables dans votre contrôleur une fois résolues:
myapp.controller('PropertyController', function($scope, propertyData) {
$scope.property = propertyData;
});
Je pense que votre fonction contrôleur a besoin du paramètre $stateParams
à partir duquel vous pouvez obtenir votre propertyId
. Ensuite, vous pouvez utiliser le paramètre $q
et créer la promesse de définir $scope.property
avec quelque chose comme ceci:
var deferred = $q.defer();
gapi.client.realestate.get(propertyId).execute(function(resp) {
deferred.resolve(resp);
});
$scope.property=deferred.promise;
Voici description de l'utilisation de promesses pour le traitement des appels asynchrones.
Essayez ce moyen facile d'utiliser résoudre de manière appropriée
Code d'état:
.state('yourstate', {
url: '/demo/action/:id',
templateUrl: './view/demo.html',
resolve:{
actionData: function(actionData, $q, $stateParams, $http){
return actionData.actionDataJson($stateParams.id);
}
},
controller: "DemoController",
controllerAs : "DemoCtrl"
})
Dans le code ci-dessus, j’envoie des données de paramètres que j’envoie dans l’url. Par exemple, si j’envoie comme ceci /demo/action/5
.__, ce numéro 5 ira au service actionData
qui récupère des données json basées sur id.Finally stocker dans actionData
Vous pouvez l’utiliser directement dans votre contrôleur en utilisant ce nom
Le code suivant renvoie des données JSON basées sur l'id que iam transmet au niveau de l'état
(function retriveDemoJsonData(){
angular.module('yourModuleName').factory('actionData', function ($q, $http) {
var data={};
data.actionDataJson = function(id){
//The original business logic will apply based on URL Param ID
var defObj = $q.defer();
$http.get('demodata.json')
.then(function(res){
defObj.resolve(res.data[0]);
});
return defObj.promise;
}
return data;
});
})();
Que dis-tu de ça:
function PropertyController($scope, $stateParams) {
gapi.client.realestate.get($stateParams.propertyId).execute(function(resp) {
$scope.property = resp;
});
}