Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

unidades:03_servicios:10_ejemploseguro [2014/07/30 23:52]
admin [La clase del propio servicio]
unidades:03_servicios:10_ejemploseguro [2014/08/29 22:15] (actual)
admin
Línea 1: Línea 1:
 ====== 3.10 Ejemplo servicio ====== ====== 3.10 Ejemplo servicio ======
-En este tema retornamos ​ahora el ejemplo del seguro médico para añadir un ''​provider''​. ​+En este tema retornamos el ejemplo del seguro médico para añadir un ''​provider''​. ​
  
-Al ver el servicio ''​$http''​ en el tema [[unidades:​03_servicios:​02_http]] vimos que no debía hacerse una llamada a ''​$http''​ en el propio controlador . Ahora vamos a crea un ''​provider''​ que encapsule la llamada a ''​$http''​.+Al ver el servicio ''​$http''​ en el tema [[unidades:​03_servicios:​02_http]] vimos que no debía hacerse una llamada a ''​$http''​ en el propio controlador . Ahora vamos a crear un ''​provider''​ que encapsule la llamada a ''​$http''​.
  
-El servicio será un objeto llamado ''​remoteResource''​ que nos permitirá acceder al servidor para acceder a los datos. Como aun no hemos visto la parte de servidor ni la parte de REST ni las promesas , solo vamos a hacer un único método sencillo que nos permita leer los datos, mas adelante en el curso seguiremos mejorando este servicio. Por lo tanto aun será un poco chapuza el ejemplo.+El servicio será un objeto llamado ''​remoteResource''​ que nos permitirá acceder al servidor para acceder a los datos. Como aún no hemos visto la parte de servidor ni la parte de REST ni las promesas , sólo vamos a hacer un único método sencillo que nos permita leer los datos. Más adelante en el curso seguiremos mejorando este servicio. Por lo tanto aun será un poco chapuza el ejemplo.
  
 ===== La configuración ===== ===== La configuración =====
  
-Nuestro servicio va a ser un ''​provider''​ ya que tenemos que indicar la url a partir de la que se debe bajar los datos. Como hemos hecho en el tema anterior ​eso lo pondremos en una constante de nuestra aplicación.+Nuestro servicio va a ser un ''​provider''​ ya que tenemos que indicar la url a partir de la que debemos ​bajar los datos. Como hemos hecho en el tema anterior ​éso lo pondremos en una constante de nuestra aplicación.
  
 <sxh js> <sxh js>
Línea 14: Línea 14:
 </​sxh>​ </​sxh>​
  
-La contante ​vale el valor "​."​ porque los datos a bajar están en la misma ruta que nuestra página web.+La constante ​vale el valor "​."​ porque los datos a bajar están en la misma ruta que nuestra página web.
  
 El provider tendrá un único método para configurarlo llamado ''​setBaseUrl''​ por lo que tendremos el siguiente bloque config: El provider tendrá un único método para configurarlo llamado ''​setBaseUrl''​ por lo que tendremos el siguiente bloque config:
Línea 23: Línea 23:
 </​sxh>​ </​sxh>​
  
-Fijaté como el nombre del provider es "​remoteResourceProvider",​ es decir que acaba en "​Provider"​ aunque nuestro servicio ​solo se llama "​remoteResource"​.+Fíjate cómo el nombre del provider es "​remoteResourceProvider",​ es decir que acaba en "​Provider"​ aunque nuestro servicio ​sólo se llama "​remoteResource"​.
  
 ===== El provider ===== ===== El provider =====
Línea 42: Línea 42:
  
   * Línea 1: Definimos el constructor de la clase ''​RemoteResourceProvider''​   * Línea 1: Definimos el constructor de la clase ''​RemoteResourceProvider''​
-  * Línea 3: Un método público llamado ''​setBaseUrl''​ para configurar el servicio. ​Este es el método que hemos llamado desde el bloque config. +  * Línea 3: Un método público llamado ''​setBaseUrl''​ para configurar el servicio. ​Éste es el método que hemos llamado desde el bloque config. 
-  * Línea 6: El método ''​$get''​ que es el factory-provider con la función de factoría a la que se le inyecta el servicio de ''​$http''​. +  * Línea 6: El método ''​$get''​que es el factory-provider con la función de factoría a la que se le inyecta el servicio de ''​$http''​. 
-  * Línea 7: Ahora la función de factoría crea el nuevo objeto de la clase ''​RemoteResource''​. Siendo ​esta clase realmente la que hace todo el trabajo y la que se usará desde el controlador. En el constructor además de pasarle el ''​$http''​ que necesita, también se le pasa la URL Base para configurar el servicio.+  * Línea 7: Ahora la función de factoría crea el nuevo objeto de la clase ''​RemoteResource''​, siendo ​esta clase realmente la que hace todo el trabajo y la que se usará desde el controlador. En el constructor además de pasarle el ''​$http''​ que necesita, también se le pasa la URL Base para configurar el servicio.
   * Línea 11: Finalmente se registra el ''​provider''​.   * Línea 11: Finalmente se registra el ''​provider''​.
  
Línea 73: Línea 73:
  
 ===== El controlador ===== ===== El controlador =====
-Por último nos queda ver como queda el controlador al usar el nuevo servicio.+Por último nos queda ver cómo queda el controlador al usar el nuevo servicio.
  
 <sxh js;​highlight:​ [1,​26,​27,​28,​29,​30]>​ <sxh js;​highlight:​ [1,​26,​27,​28,​29,​30]>​
Línea 111: Línea 111:
  
   * Línea 1: Ahora en el controlador en vez de inyectar el servicio ''​$http''​ se inyecta el servicio ''​remoteResource''​.   * Línea 1: Ahora en el controlador en vez de inyectar el servicio ''​$http''​ se inyecta el servicio ''​remoteResource''​.
-  * +  * Linea 26: Se llama al método ''​get''​ del servicio ''​remoteResource''​ y se le pasa como argumentos las 2 funciones. 
 +  * Línea 27: Si todo va bien , se pasan los datos a la propiedad ''​seguro''​ del ''​$scope''​. 
 +  * Línea 28: Es la segunda función anónima que se llama si hay algún error. 
 +  * Línea 29: Si falla algo se ejecuta el ''​alert''​.
 ===== Ejemplo ===== ===== Ejemplo =====
 El código completo del ejemplo es el siguiente: El código completo del ejemplo es el siguiente:
Línea 156: Línea 159:
  
 <sxh js;​title:​script.js>​ <sxh js;​title:​script.js>​
-var app=angular.module("​app",​[]);​+var app = angular.module("​app",​ []);
  
-app.constant("​baseUrl"​,"​."​);​ +function RemoteResource($http,baseUrl) { 
- +  this.get=function(fnOK,​fnError) {
-function RemoteResourceProvider() { +
-  var _baseUrl; +
-  this.setBaseUrl=function(baseUrl) { +
-    _baseUrl=baseUrl;​ +
-  } +
-  this.$get=['​$http',​function($http) { +
-    return { +
-      get:function(fnOK,​fnError) {+
         $http({         $http({
           method: '​GET', ​           method: '​GET', ​
-          url: _baseUrl+'/​datos.json'​+          url: baseUrl+'/​datos.json'​
         }).success(function(data,​ status, headers, config) {         }).success(function(data,​ status, headers, config) {
             fnOK(data);             fnOK(data);
Línea 177: Línea 172:
         });         });
       }       }
-    ​}+} 
 + 
 +function RemoteResourceProvider() { 
 +  var _baseUrl; 
 +  this.setBaseUrl=function(baseUrl) { 
 +    _baseUrl=baseUrl;​ 
 +  } 
 +  this.$get=['​$http',​function($http) { 
 +    return new RemoteResource($http,​_baseUrl);​
   }];   }];
 } }
  
-app.provider("​remoteReource",​RemoteResourceProvider);​+app.provider("​remoteResource",​RemoteResourceProvider);​ 
 + 
  
-app.config(['​baseUrl','​remoteReourceProvider',​function(baseUrl,​remoteReourceProvider){ +app.constant("​baseUrl",​ "​."​);​ 
-  ​remoteReourceProvider.setBaseUrl(baseUrl);​+app.config(['​baseUrl',​ 'remoteResourceProvider',​function(baseUrl, ​remoteResourceProvider) { 
 +    ​remoteResourceProvider.setBaseUrl(baseUrl);​
 }]); }]);
  
-app.controller("​SeguroController",​['​$scope','​remoteReource',​function($scope,​remoteReource) { + 
-  $scope.seguro={ +app.controller("​SeguroController",​ ['​$scope',​ 'remoteResource',​function($scope, ​remoteResource) { 
-    nif:"",​ +    $scope.seguro = { 
-    nombre:"",​ +      nif: "",​ 
-    ape1:"",​ +      nombre: "",​ 
-    edad:​undefined,​ +      ape1: "",​ 
-    sexo:"",​ +      edad: undefined,​ 
-    casado:​false,​ +      sexo: "",​ 
-    numHijos:​undefined,​ +      casado: false, 
-    embarazada:​false,​ +      numHijos: undefined,​ 
-    coberturas: { +      embarazada: false, 
-      oftalmologia:​false,​ +      coberturas: { 
-      dental:​false,​ +        oftalmologia:​ false, 
-      fecundacionInVitro:​false +        dental: false, 
-    }, +        fecundacionInVitro:​ false 
-    enfermedades:​{ +      }, 
-      corazon:​false,​ +      enfermedades:​ { 
-      estomacal:​false,​ +        corazon: false, 
-      rinyones:​false,​ +        estomacal: false, 
-      alergia:​false,​ +        rinyones: false, 
-      nombreAlergia:""​ +        alergia: false, 
-    }, +        nombreAlergia:​ ""​ 
-    fechaCreacion:​new Date()+      }, 
 +      fechaCreacion:​ new Date() 
 +    } 
 + 
 +    remoteResource.get(function(seguro) { 
 +      $scope.seguro = seguro; 
 +    }, function(data,​ status) { 
 +      alert("​Ha fallado la petición. Estado HTTP:" + status); 
 +    }); 
   }   }
-   +]);
-  remoteReource.get(function(seguro) { +
-    $scope.seguro=seguro;​ +
-  },​function(data,​status) { +
-    alert("​Ha fallado la petición. Estado HTTP:"​+status);​ +
-  }); +
-   +
-}]);+
 </​sxh>​ </​sxh>​
  
 {{url>​http://​embed.plnkr.co/​pmsJkq}} {{url>​http://​embed.plnkr.co/​pmsJkq}}
 +===== Malas prácticas =====
 +En muchos ejemplos que se ven de AngularJS se tiende a definir un provider en un único bloque en vez de definir diversas funciones separadas como hemos hecho aqui.
 +
 +Podemos ver el siguiente trazo de código en el que se ha definido el provider usando varias funciones anónimas anidadas.
 +
 +<sxh js>
 +app.provider("​remoteResource",​ function() {
 +  var _baseUrl;
 +  this.setBaseUrl = function(baseUrl) {
 +    _baseUrl = baseUrl;
 +  }
 +  this.$get = ['​$http',​
 +    function($http) {
 +      return new function($http,​ baseUrl) {
 +        this.get = function(fnOK,​ fnError) {
 +          $http({
 +            method: '​GET',​
 +            url: baseUrl + '/​datos.json'​
 +          }).success(function(data,​ status, headers, config) {
 +            fnOK(data);
 +          }).error(function(data,​ status, headers, config) {
 +            fnError(data,​ status);
 +          });
 +        }
 +      }($http, _baseUrl);
 +    }
 +  ];
 +});
 +</​sxh>​
  
 +Este código - aunque funciona - no es recomendable por lo complejo que resulta de entender.
  
 +===== Referencias =====
 +  * [[https://​github.com/​johnpapa/​angularjs-styleguide/​blob/​master/​README.md|AngularJS Style Guide by @john_papa]]
 +  * [[https://​github.com/​toddmotto/​angularjs-styleguide/​blob/​master/​README.md|AngularJS styleguide by @toddmotto]]
unidades/03_servicios/10_ejemploseguro.1406757137.txt.gz · Última modificación: 2014/07/30 23:52 por admin
Ir hasta arriba
CC Attribution-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0