Diferencias

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

Enlace a la vista de comparación

unidades:09_directivas:04_ejemploseguro [2014/08/29 19:39]
admin [9.4 Ejemplo de directiva]
unidades:09_directivas:04_ejemploseguro [2014/09/07 09:45] (actual)
admin
Línea 3: Línea 3:
  
 Para que funciona el Datepicker es necesario añadir lo siguiente a la página ''​index.html'':​ Para que funciona el Datepicker es necesario añadir lo siguiente a la página ''​index.html'':​
 +  * CSS de JQuery UI
   * JavaScript de JQuery   * JavaScript de JQuery
   * JavaScript de JQuery UI   * JavaScript de JQuery UI
-  * CSS de JQuery UI 
  
 <sxh html> <sxh html>
Línea 14: Línea 14:
  
  
-La directiva se llamara ​''​caDatepciker"​ y se usará como un atributo HTML. El valor del atributo será el formato de fecha que queremos que tenga el Datepicker según los formatos de fecha definidos por [[http://​api.jqueryui.com/​datepicker/#​utility-formatDate|$.datepicker.formatDate]].+La directiva se llamara ​"caDatepciker"​ y se usará como un atributo HTML. El valor del atributo será el formato de fecha que queremos que tenga el Datepicker según los formatos de fecha definidos por [[http://​api.jqueryui.com/​datepicker/#​utility-formatDate|$.datepicker.formatDate]].
  
 Por lo tanto la directiva se usará de la siguiente manera: Por lo tanto la directiva se usará de la siguiente manera:
Línea 31: Línea 31:
 <sxh js;​highlight:​ [3,6,7]> <sxh js;​highlight:​ [3,6,7]>
 app.directive('​caDatepicker',​ [function(dateFormat) { app.directive('​caDatepicker',​ [function(dateFormat) {
-        ​return { +  ​return { 
-            restrict: '​A',​ +    restrict: '​A',​ 
-            link: function($scope,​ element, attributes) {+    link: function($scope,​ element, attributes) { 
 +     
 +      element.datepicker({ 
 +        dateFormat: attributes.caDatepicker 
 +      }); 
 +    } 
 +  }; 
 +}]); 
 +</​sxh>​ 
 +  * Línea 3: Decimos que solo se puede usar como Atributo HTML 
 +  * Línea 6: En la función de link llamamos a la función de JQuery UI para que transforme el ''<​input>''​ en un Datepicker. El método ''​datepicker()''​ acepta como argumento un objeto de configuración. 
 +  * Línea 7: Al objeto de configuración del método ''​datepicker()''​ le pasamos la propiedad ''​dateFormat''​ con el formato de fecha, sacando dicho formato del valor del atributo de la propia directiva: ''​attributes.caDatepicker''​
  
-                element.datepicker({ +Si usáramos la directiva veríamos que aparentemente funciona pero si añadiéramos el siguiente código HTML a la página
-                    dateFormatattributes.caDatepicker + 
-                }); +<sxh html> 
-            } +{{seguro.fechaCreacion}}
-        }+
-    ​}]);+
 </​sxh>​ </​sxh>​
 +
 +comprobaríamos que al cambiar la fecha con el ratón pinchando en el datepick no se cambia el texto de la expresión ''​%%{%%{seguro.fechaCreacion%%}%%}''​.
 +
 +**¿Que ha pasado?**
 +
 +Que AngularJS no se ha enterado que le han cambiado el dato dentro de ''<​input>''​ ya que ha sido un evento externo a él así que la propiedad ''​$scope.seguro.fechaCreacion''​ no se ha modificado.
 +
 +La solución a esto la tenemos en el propio datepicker que provee de un evento que se activa cuando él cambia la fecha. Este evento se llama [[http://​api.jqueryui.com/​datepicker/#​option-onSelect|onSelect]].
 +
 +Para poder usar el evento [[http://​api.jqueryui.com/​datepicker/#​option-onSelect|onSelect]] solo tenemos que añadir un nueva nueva propiedad llamada ''​onSelect''​ con una función que se llamará cuando se cambie la fecha. En esa función el objeto ''​this''​ hace referencia al propio tag ''<​input>''​. Dentro de esa función solo tendremos que lanzar el evento ''​onChange''​ de que algo ha cambiado en el ''<​input>''​ y AngularJS ya se enterará.
 +
 +La directiva ahora queda de la siguiente forma:
 +<sxh js;​highlight:​ [8,9]>
 +app.directive('​caDatepicker',​ [function(dateFormat) {
 +  return {
 +    restrict: '​A',​
 +    link: function($scope,​ element, attributes) {
 +    ​
 +      element.datepicker({
 +        dateFormat: attributes.caDatepicker,​
 +        onSelect: function() {
 +          $(this).trigger('​change'​);​
 +        }
 +      });
 +    }
 +  };
 +}]);
 +</​sxh>​
 +  * Linea 8: Añadimos la función de //​callback//​ del evento ''​onSelect''​
 +  * Línea 9: Lanzamos un evento de ''​onChange''​ en el ''<​input>''​ para que AngularJS sepa que algo ha cambiado y actualice consecuentemente la propiedad ''​$scope.seguro.fechaCreacion''​.
 +
 +<note important>​
 +La directiva realmente está sin acabar ya que también debería de transformar el dato de tipo String del ''<​input>''​ en un objeto ''​Date''​ cuando se guarda en ''​$scope.seguro.fechaCreacion''​. Es decir que ''​$scope.seguro.fechaCreacion''​ debería ser de tipo Date en vez de tipo String.
 +Eso ya lo veremos en la unidad [[unidades:​13_formulariosadv:​00_start]].
 +</​note>​
 ===== Ejemplo ===== ===== Ejemplo =====
  
 {{url>​http://​embed.plnkr.co/​euC4cS}} {{url>​http://​embed.plnkr.co/​euC4cS}}
 +
 +===== Referencias =====
 +  * [[http://​api.jqueryui.com/​datepicker|Datepicker]]
unidades/09_directivas/04_ejemploseguro.1409333984.txt.gz · Última modificación: 2014/08/29 19:39 (editor externo)
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