Ich möchte ein Formular mit Daten anzeigen, die dem bearbeiteten Element entsprechen. Ich verwende ui-router
für das Routing. Ich habe einen Zustand definiert:
myapp.config(function($stateProvider) {
$stateProvider.
.state('layout.propertyedit', {
url: "/properties/:propertyId",
views : {
"[email protected]": {
templateUrl : 'partials/content2.html',
controller: 'PropertyController'
}
}
});
In PropertyController
möchte ich $scope.property
mit den Daten des folgenden Aufrufs (Google Cloud-Endpunkte) festlegen:
gapi.client.realestate.get(propertyId).execute(function(resp) {
console.log(resp);
});
Ich weiß nicht, ob ich resolve
verwenden kann, da die Daten asynchron zurückgegeben werden. Ich habe es versucht
resolve: {
propertyData: function() {
return gapi.client.realestate.get(propertyId).execute(function(resp) {
console.log(resp);
});
}
}
Erste Ausgabe, die propertyId
ist nicht definiert. Wie erhält man die propertyId
vom url: "/properties/:propertyId"
?
Grundsätzlich möchte ich $scope.property
in PropertyController
auf das vom async-Aufruf zurückgegebene resp
-Objekt setzen.
BEARBEITEN:
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;
}
});
Sie müssen die Dokumente für die Auflösung lesen. Auflösungsfunktionen sind injizierbar, und Sie können $stateParams
verwenden, um den korrekten Wert von Ihren Routen zu erhalten, z.
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;
}
}
Schließlich können die Werte für die Auflösungsfunktionen nach der Auflösung in Ihre Steuerung injiziert werden:
myapp.controller('PropertyController', function($scope, propertyData) {
$scope.property = propertyData;
});
Ich denke, Ihre Controller-Funktion benötigt einen $stateParams
-Parameter, von dem Sie Ihre propertyId
erhalten können. Dann können Sie den $q
-Parameter verwenden und ein Versprechen erstellen, um $scope.property
folgendermaßen festzulegen:
var deferred = $q.defer();
gapi.client.realestate.get(propertyId).execute(function(resp) {
deferred.resolve(resp);
});
$scope.property=deferred.promise;
Hier ist Beschreibung der Verwendung von Versprechungen zur Behandlung von asynchronen Aufrufen.
Probieren Sie diese einfache Methode aus, um die Auflösung in geeigneter Weise zu verwenden
Landescode:
.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"
})
Im obigen Code sende ich Parameterdaten, die ich in der URL sende. Wenn ich zum Beispiel /demo/action/5
.__ sende, sende ich diese Nummer 5 an actionData
. Dieser Dienst ruft einige Json-Daten basierend auf der ID ab Speichern in actionData
Sie können dies in Ihrem Controller direkt verwenden, indem Sie diesen Namen verwenden
Der folgende Code gibt einige JSON-Daten basierend auf der ID zurück, die von iam auf Statusebene übergeben werden
(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;
});
})();
Wie wäre es damit:
function PropertyController($scope, $stateParams) {
gapi.client.realestate.get($stateParams.propertyId).execute(function(resp) {
$scope.property = resp;
});
}