template sref otherwise example angularjs angular-ui angular-ui-router

otherwise - ui sref angularjs example



Ui-router angular obtiene datos asincrónicos con resolución (4)

Quiero mostrar un formulario con los datos correspondientes al elemento editado. Yo uso ui-router para el enrutamiento. Definí un estado:

myapp.config(function($stateProvider) { $stateProvider. .state(''layout.propertyedit'', { url: "/properties/:propertyId", views : { "contentView@": { templateUrl : ''partials/content2.html'', controller: ''PropertyController'' } } });

En PropertyController , quiero configurar $scope.property con datos provenientes de la siguiente llamada (Google Cloud Endpoints):

gapi.client.realestate.get(propertyId).execute(function(resp) { console.log(resp); });

No sé si puedo usar la resolve porque los datos se devuelven de forma asíncrona. Lo intenté

resolve: { propertyData: function() { return gapi.client.realestate.get(propertyId).execute(function(resp) { console.log(resp); }); } }

Primer problema, el propertyId no está definido. ¿Cómo se obtiene el propertyId de la url: "/properties/:propertyId" ?

Básicamente quiero establecer $scope.property en PropertyController para el objeto resp devuelto por la llamada asincrónica.

EDITAR:

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; } });


Creo que su función de controlador necesita el parámetro $stateParams desde el que puede obtener su propertyId . Luego puede usar el parámetro $q y crear la promesa de establecer $scope.property con algo como esto:

var deferred = $q.defer(); gapi.client.realestate.get(propertyId).execute(function(resp) { deferred.resolve(resp); }); $scope.property=deferred.promise;

Aquí hay una descripción del uso de promesas para manejar llamadas asíncronas.


Qué tal esto:

function PropertyController($scope, $stateParams) { gapi.client.realestate.get($stateParams.propertyId).execute(function(resp) { $scope.property = resp; }); }


Necesitas leer los documentos para resolverlos . Las funciones de $stateParams son inyectables, y puede usar $stateParams para obtener el valor correcto de sus rutas, así:

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; } }

Finalmente, los valores para las funciones de resolución son inyectables en su controlador una vez resueltos:

myapp.controller(''PropertyController'', function($scope, propertyData) { $scope.property = propertyData; });


Pruebe esta manera fácil de usar la resolución de la manera correcta

Código del estado:

.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" })

En el código anterior, estoy enviando datos de parámetros que estoy enviando en la url. Por ejemplo, si envío como este /demo/action/5 este número 5 irá al servicio actionData para que el servicio recupere algunos datos json basados ​​en id. Por último, los datos se almacenarán en actionData . Puede usar eso en su controlador directamente usando ese nombre

El código siguiente devuelve algunos datos JSON basados ​​en el ID que IAM pasa a nivel estatal

(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; }); })();