Aspectos internos de AngularJS en profundidad, parte 2

 

 

 

  • Clase magistral de tipografía, con Elliot Jay Stocks
  • Accessibility for Designers, with Stéphanie Walter

  • Índice
    1. ¿Qué diablos es una directiva?
    2. Crear una directiva
    3. Ámbitos infantiles juguetones
      1. Alcance solitario y aislado
    4. Elige tu arma: @, o=
      1. Observador de atributos:@
      2. Generador de expresiones:
      3. Enlace bidireccional:=
    5. Plantillas de vista sensible

    ¿Qué diablos es aislar ámbitos, transclusión, vincular funciones, compiladores y controladores de directivas? En este artículo, Nicolas Bevacqua cubrirá todo eso y más. Si la figura parece excesivamente alucinante, entonces este artículo podría ser para usted. Este artículo está basado en el árbol AngularJS v1.3.0. ¿Estás listo? ¡Hagámoslo!

     

    En el artículo anterior de esta serie , hablé de los eventos de alcance y el comportamiento del ciclo de resumen. Esta vez hablaré de directivas. Este artículo cubrirá ámbitos aislados, transclusión, funciones de enlace, compiladores, controladores de directivas y más .

    Si la figura parece excesivamente alucinante, entonces este artículo podría ser para usted.

    Descargo de responsabilidad: este artículo se basa en el árbol AngularJS v1.3.0 .

    ¿Qué diablos es una directiva?

    Una directiva es un componente típicamente pequeño que está destinado a interactuar con el DOM en AngularJS. Se utiliza como una capa de abstracción encima del DOM, y la mayor parte de la manipulación se puede lograr sin tocar los elementos del DOM, envueltos en jQuery, jqLite o de otro modo. Esto se logra mediante el uso de expresiones y otras directivas para lograr los resultados que desea.

    Las directivas en el núcleo de AngularJS pueden vincular la propiedad de un elemento ( como visibilidad, lista de clases, texto interno, HTML interno o valor ) a la propiedad o expresión de un alcance. En particular, estos enlaces se actualizarán cada vez que se digieran los cambios en el alcance mediante relojes. De manera similar, y en la dirección opuesta, los atributos DOM se pueden "vigilar" usando una $observefunción, que activará una devolución de llamada cada vez que cambie la propiedad vigilada.

    Las directivas son, en pocas palabras, la cara más importante de AngularJS. Si domina las directivas, no tendrá ningún problema al tratar con aplicaciones AngularJS. Del mismo modo, si no logras entender las directivas, estarás aferrándote a un clavo ardiendo sin saber qué harás a continuación. Dominar las directivas lleva tiempo, especialmente si estás tratando de evitar simplemente envolver un fragmento de código basado en jQuery y dar por terminado el día.

    En AngularJS, puede crear directivas, servicios y controladores en componentes que se pueden reutilizar con la frecuencia que tenga sentido. Por ejemplo, es posible que tenga una directiva simple que active una clase basada en una expresión de alcance vigilada, y me imagino que sería una directiva bastante común, utilizada en todas partes de su aplicación, para señalar el estado de un componente particular en su código. Podría tener un servicio para agregar el manejo de atajos de teclado y hacer que los controladores, directivas y otros servicios registren atajos con ese servicio, enraizando todo el manejo de atajos de teclado en un servicio bien autónomo.

    Las directivas también son piezas de funcionalidad reutilizables, pero la mayoría de las veces se asignan a fragmentos o plantillas DOM , en lugar de simplemente proporcionar funcionalidad. Es hora de profundizar en las directivas de AngularJS y sus casos de uso.

    Crear una directiva

    Anteriormente, enumeré cada propiedad disponible en un alcance en AngularJS y la usé para explicar el mecanismo de resumen y cómo funcionan los alcances. Haré lo mismo con las directivas, pero esta vez repasaré las propiedades del objeto devuelto por la función de fábrica de una directiva y cómo cada una de esas propiedades influye en la directiva que estamos definiendo.

    Lo primero que llama la atención es el nombre de la directiva. Veamos un breve ejemplo.

    angular.module('PonyDeli').directive('pieceOfFood', function () { var definition = { // 

    Aunque en el fragmento anterior estamos definiendo una directiva llamada ‘pieceOfFood’, la convención de AngularJS estipula que usamos una versión con guiones de ese nombre en el marcado HTML. Es decir, si esta directiva se implementara como un atributo, entonces podría necesitar hacer referencia a ella en mi HTML de esta manera:

     

    span piece-of-food/span

    De forma predeterminada, las directivas sólo se pueden activar como atributos. Pero, ¿qué pasa si quieres cambiar este comportamiento? Puedes usar la restrictopción.

    • restrictDefine cómo se puede aplicar una directiva en el marcado.
    angular.module('PonyDeli').directive('pieceOfFood', function () { return { restrict: 'E', template: // ... };});

    Por alguna razón que no puedo comprender, decidieron ofuscar lo que de otro modo sería un marco detallado, y terminamos con letras mayúsculas simples para definir cómo se restringe una directiva. Aparece una lista de opciones disponiblesrestrict en GitHub y el valor predeterminado esEA .

    • 'A': los atributos están permitidosspan piece-of-food/span
    • 'E': los elementos están permitidospiece-of-food/piece-of-food
    • 'C': como nombre de clasespan class='piece-of-food'/span
    • 'M': como comentario!-- directive: piece-of-food --
    • 'AE': Puedes combinar cualquiera de estos para relajar un poco la restricción.

    Nunca utilices ‘C’ni ’M’restrinjas tus directivas. El uso ‘C’no se destaca en el marcado y ’M’estaba destinado a la compatibilidad con versiones anteriores. Sin embargo, si te apetece ser gracioso, podrías argumentar a favor de configurarlo restricten ‘ACME’.

    (¿Recuerdas que en el último artículo dije que siguiéramos los consejos con una pizca de sal ? No hagas eso con los míos, ¡mi consejo es fantástico!)

    Desafortunadamente, el resto de las propiedades de un objeto de definición de directiva son mucho más oscuras.

    • scopeestablece cómo interactúa una directiva con el $parentalcance

    Debido a que analizamos detalladamente los alcances en el artículo anterior, aprender a usar la scopepropiedad correctamente no debería ser tan insoportable. Comencemos con el valor predeterminado, scope: falsedonde la cadena de alcance no se ve afectada: obtendrá cualquier alcance que se encuentre en el elemento asociado, siguiendo las reglas que describí en el artículo anterior .

    Obviamente, dejar la cadena de alcance intacta es útil cuando su directiva no interactúa con el alcance en absoluto, pero eso rara vez sucede. Un escenario mucho más común en el que es útil no tocar el alcance es crear una directiva que no tiene motivos para ser instanciada más de una vez en un alcance determinado y que simplemente interactúa con una única propiedad de alcance, el nombre de la directiva . Esto es más declarativo cuando se combina con , el valor restrict: ‘A’predeterminado . restrict(El siguiente código está disponible en Codepen ).

    angular.module('PonyDeli').directive('pieceOfFood', function () { return { template: '{{pieceOfFood}}', link: function (scope, element, attrs) { attrs.$observe('pieceOfFood', function (value) { scope.pieceOfFood = value; }); } };});
    body ng-app='PonyDeli' span piece-of-food='Fish Chips'/span/body

    Hay algunas cosas a tener en cuenta aquí que aún no hemos discutido. Aprenderá más sobre la linkpropiedad más adelante en este artículo. Por el momento, considérelo como un controlador que se ejecuta para cada instancia de la directiva .

     

    En la función de enlace de la directiva, podemos acceder attrs, que es una colección de atributos presentes en element. Esta colección tiene un método especial, llamado $observe(), que activará una devolución de llamada cada vez que cambie una propiedad . Sin observar el atributo en busca de cambios, la propiedad nunca llegaría al alcance y no podríamos vincularnos a ella en nuestra plantilla.

    Podemos modificar el código anterior, haciéndolo mucho más útil, agregándolo scope.$evala la mezcla. ¿Recuerda cómo se puede utilizar para evaluar una expresión frente a un alcance? Mire el código a continuación ( también en Codepen ) para tener una mejor idea de cómo podría ayudarnos.

    var deli = angular.module('PonyDeli', []);deli.controller('foodCtrl', function ($scope) { $scope.piece = 'Fish Chips';});deli.directive('pieceOfFood', function () { return { template: '{{pieceOfFood}}', link: function (scope, element, attrs) { attrs.$observe('pieceOfFood', function (value) { scope.pieceOfFood = scope.$eval(value); }); } };});
    body ng-app='PonyDeli' ng-controller='foodCtrl' span piece-of-food='piece'/span/body

    En este caso, estoy evaluando el valor del atributo, piecefrente al alcance, que se define $scope.pieceen el controlador. Por supuesto, podría usar una plantilla {{piece}}directamente, pero eso requeriría conocimientos específicos sobre qué propiedad en el alcance desea rastrear. Este patrón proporciona un poco más de flexibilidad , aunque seguirá compartiendo el alcance entre todas las directivas , lo que puede generar un comportamiento inesperado si intenta agregar más de una directiva en el mismo alcance.

    Ámbitos infantiles juguetones

    Podría resolver ese problema creando un ámbito secundario, que hereda prototípicamente de su padre. Para crear un ámbito secundario, simplemente necesita declarar scope: true.

    var deli = angular.module('PonyDeli', []);deli.controller('foodCtrl', function ($scope) { $scope.pieces = ['Fish Chips', 'Potato Salad'];});deli.directive('pieceOfFood', function () { return { template: '{{pieceOfFood}}', scope: true, link: function (scope, element, attrs) { attrs.$observe('pieceOfFood', function (value) { scope.pieceOfFood = scope.$eval(value); }); } };});
    body ng-app='PonyDeli' ng-controller='foodCtrl' p piece-of-food='pieces[0]'/p p piece-of-food='pieces[1]'/p/body

    Como puede ver, ahora podemos usar múltiples instancias de la directiva y obtener el comportamiento deseado porque cada directiva crea su propio alcance. Sin embargo, existe una limitación: varias directivas sobre un elemento tienen el mismo alcance.

     

    Nota: Si varias directivas en el mismo elemento solicitan un nuevo alcance, solo se crea un nuevo alcance.

    Alcance solitario y aislado

    Una última opción es crear un ámbito local o aislado. La diferencia entre un ámbito aislado y un ámbito secundario es que el primero no hereda de su padre (pero aún es accesible enscope.$parent ). Puede declarar un ámbito aislado como este: scope: {}. Puede agregar propiedades al objeto, que se vinculan a los datos del ámbito principal pero son accesibles en el ámbito local. Al igual que , las propiedades de alcance aislado tienen una sintaxis restrictconcisa pero confusa, en la que se pueden utilizar símbolos como y para definir cómo se vincula la propiedad.@=

    Puede omitir el nombre de la propiedad si va a utilizarlo como clave en su ámbito local. Es decir, pieceOfFood: ‘=’es una abreviatura de pieceOfFood: ‘=pieceOfFood’; son equivalentes.

    Elige tu arma: @, o=

    ¿Qué significan entonces esos símbolos? Los ejemplos que codifiqué, que se enumeran a continuación, pueden ayudarle a decodificarlos.

    Observador de atributos:@

    El uso @se vincula al resultado de observar un atributo en el ámbito principal.

    body ng-app='PonyDeli' ng-controller='foodCtrl' p note='You just bought some {{type}}'/p/body
    deli.directive('note', function () { return { template: '{{note}}', scope: { note: '@' } };});

    Esto equivale a observar el atributo en busca de cambios y actualizar nuestro alcance local. Por supuesto, usar la @notación es mucho más "AngularJS".

    deli.directive('note', function () { return { template: '{{note}}', scope: {}, link: function (scope, element, attrs) { attrs.$observe('note', function (value) { scope.note = value; }); } };});

    Los observadores de atributos son más útiles cuando consumen opciones para una directiva . Sin embargo, si queremos cambiar el comportamiento de la directiva en función del cambio de opciones, escribir la attrs.$observelínea nosotros mismos podría tener más sentido que hacer que AngularJS lo haga internamente y crear una vigilancia por nuestra parte, lo que sería más lento.

    En estos casos, basta con reemplazar scope.note = value, en el $observecontrolador que se muestra arriba, por lo que le hubiera puesto al $watchoyente.

    Nota: tenga en cuenta que, cuando tratamos con @, estamos hablando de observar y atribuir , en lugar de vincularnos al ámbito principal. Pirateking Ver anime gratis online

    Generador de expresiones:

    El uso le proporciona una función de evaluación de expresiones en el contexto del ámbito principal.

    body ng-app='PonyDeli' ng-controller='foodCtrl' p note='"You just bought some " + type'/p/body
    deli.directive('note', function () { return { template: '{{note()}}', scope: { note: '' } };});

    A continuación, describí cómo podría implementar esa misma funcionalidad en la función de enlace, en caso de que no lo sepa . Este es un poco más largo que @, porque analiza la expresión en el atributo una vez, creando una función reutilizable.

     

    deli.directive('note', function ($parse) { return { template: '{{note()}}', scope: {}, link: function (scope, element, attrs) { var parentGet = $parse(attrs.note); scope.note = function (locals) { return parentGet(scope.$parent, locals); }; } };});

    Los creadores de expresiones, como podemos ver, generan un método que consulta el ámbito principal. Puede ejecutar el método cuando lo desee e incluso observar los cambios en la salida. Este método debe tratarse como una consulta de sólo lectura en una expresión principal y, como tal, sería más útil en dos escenarios. La primera es cuando necesita observar cambios en el ámbito principal, en cuyo caso configuraría una vigilancia en la expresión de función note(), que es, en esencia, lo que hicimos en el ejemplo anterior.

    La otra situación en la que esto puede resultar útil es cuando necesita acceso a un método en el ámbito principal. Supongamos que el ámbito principal tiene un método que actualiza una tabla, mientras que su ámbito local representa una fila de la tabla. Cuando se elimina la fila de la tabla, es posible que desee actualizar la tabla. Si el botón está en el ámbito secundario, entonces tendría sentido utilizar un enlace para acceder a la funcionalidad de actualización en el ámbito principal. Este es solo un ejemplo artificial: es posible que prefiera usar eventos para ese tipo de cosas, o tal vez incluso estructurar su aplicación de alguna manera para evitar complicaciones como esa.

    Enlace bidireccional:=

    El uso =configura el enlace bidireccional entre los ámbitos local y principal.

    body ng-app='PonyDeli' ng-controller='foodCtrl' button countable='clicks'/button spanGot {{clicks}} clicks!/span/body
    deli.directive('countable', function () { return { template: 'button ng-disabled="!remaining"' + 'Click me {{remaining}} more times! ({{count}})' + '/button', replace: true, scope: { count: '=countable' }, link: function (scope, element, attrs) { scope.remaining = 10; element.bind('click', function () { scope.remaining--; scope.count++; scope.$apply(); }); } };});

    El enlace bidireccional es bastante más complicado que o @.

    deli.directive('countable', function ($parse) { return { template: 'button ng-disabled="!remaining"' + 'Click me {{remaining}} more times! ({{count}})' + '/button', replace: true, scope: {}, link: function (scope, element, attrs) { // you're definitely better off just using '' var compare; var parentGet = $parse(attrs.countable); if (parentGet.literal) { compare = angular.equals; } else { compare = function(a,b) { return a === b; }; } var parentSet = parentGet.assign; // or throw var lastValue = scope.count = parentGet(scope.$parent); scope.$watch(function () { var value = parentGet(scope.$parent); if (!compare(value, scope.count)) { if (!compare(value, lastValue)) { scope.count = value; } else { parentSet(scope.$parent, value = scope.count); } } return lastValue = value; }, null, parentGet.literal); // I told you! scope.remaining = 10; element.bind('click', function () { scope.remaining--; scope.count++; scope.$apply(); }); } };});

    Esta forma de enlace de datos es posiblemente la más útil de las tres. En este caso, la propiedad del ámbito principal se mantiene sincronizada con el ámbito local. Siempre que se actualiza el valor del ámbito local, se establece en el ámbito principal. Del mismo modo, cada vez que cambia el valor del ámbito principal, el ámbito local se actualiza. El escenario más sencillo que tengo para cuando esto sería útil es cuando tiene un ámbito secundario que se utiliza para representar un submodelo del ámbito principal. Piense en su tabla CRUD típica (crear, leer, actualizar, eliminar). La tabla en su conjunto sería el ámbito principal, mientras que cada fila estaría contenida en una directiva aislada que se vincula al modelo de datos de la fila mediante un =enlace bidireccional. Esto permitiría la modularidad y, al mismo tiempo, permitiría una comunicación efectiva entre la mesa maestra y sus hijos.

     

    Eso requirió muchas palabras, pero creo que logré resumir cómo scopefunciona la propiedad al declarar directivas y cuáles son los casos de uso más comunes. Pasemos a otras propiedades en el objeto de definición de directiva, ¿de acuerdo?

    Plantillas de vista sensible

    Las directivas son más efectivas cuando contienen pequeños fragmentos reutilizables de HTML. De ahí proviene el verdadero poder de las directivas. Estas plantillas pueden proporcionarse en texto sin formato o como un recurso que AngularJS consulta al iniciar la directiva.

    • templateAsí es como proporcionaría la plantilla de vista como texto sin formato.template: 'span ng-bind="message" /'
    • templateUrlEsto le permite proporcionar la URL a una plantilla HTML.templateUrl: /partials/message.html

    Usarlo templateUrlpara separar el HTML de su función de enlace es increíble. Hacer una solicitud AJAX cada vez que desee inicializar una directiva por primera vez, no tanto. Sin embargo, puede evitar la solicitud AJAX si completa previamente el archivo $templateCachecon una tarea de compilación, como grunt-angular-templates . También puede integrar sus plantillas de vista en HTML, pero eso es más lento porque el DOM debe analizarse, y eso no es tan conveniente en un proyecto grande con un montón de vistas. No desea un “diseño” inmenso con todas las cosas, sino archivos individuales que contengan solo una vista. Eso sería lo mejor de ambos mundos : separación de preocupaciones sin la sobrecarga adicional de las llamadas AJAX.

    También podría proporcionar un function (tElement, tAttrs)como template, pero esto no es necesario ni útil.

    • replace¿La plantilla debe insertarse como elemento secundario o insertarse en línea?

    La documentación de esta propiedad es lamentablemente confusa:

     

    " replaceespecifica dónde se debe insertar la plantilla. El valor predeterminado es false.

    • true— la plantilla reemplazará el elemento actual
    • false— la plantilla reemplazará el contenido del elemento actual"

    Entonces, cuando reemplazar es false, ¿la directiva realmente reemplaza el elemento? Eso no suena bien. Si revisas mi bolígrafo , descubrirás que el elemento simplemente se agrega if y en cierto modoreplace: false se reemplaza if .replace: true

    Como regla general, trate de mantener los reemplazos al mínimo. Las directivas deben mantener la interferencia con el DOM lo más cercana posible a cero, siempre que sea posible, por supuesto.

    Se compilan directivas, lo que da como resultado una función de preenlace y una función de postenlace. Puede definir el código que devuelve estas funciones o simplemente proporcionarlas. A continuación se detallan las diferentes formas en que puede proporcionar funciones de vinculación. Te lo advierto: esta es otra de esas “características” de AngularJS que creo que es más bien un inconveniente, porque confunde muchísimo a los recién llegados con poca o ninguna ganancia . ¡Mirad!

    compile: function (templateElement, templateAttrs) { return { pre: function (scope, instanceElement, instanceAttrs, controller) { // pre-linking function }, post: function (scope, instanceElement, instanceAttrs, controller) { // post-linking function } }}
    compile: function (templateElement, templateAttrs) { return function (scope, instanceElement, instanceAttrs, controller) { // post-linking function };}
    link: { pre: function (scope, instanceElement, instanceAttrs, controller) { // pre-linking function }, post: function (scope, instanceElement, instanceAttrs, controller) { // post-linking function }}
    link: function (scope, instanceElement, instanceAttrs, controller) { // post-linking function}

    En realidad, incluso podrías olvidarte del objeto de definición de directiva que hemos estado discutiendo hasta ahora y simplemente devolver una función posterior al enlace. Sin embargo, esto no es recomendado ni siquiera por los usuarios de AngularJS, por lo que será mejor que te mantengas alejado de él. Tenga en cuenta que las funciones de enlace no siguen el modelo de inyección de dependencia que se encuentra al declarar controladores o directivas. En su mayor parte, la inyección de dependencia en AngularJS está disponible en el nivel superior de la API, pero la mayoría de los demás métodos tienen listas de parámetros estáticos bien documentados que no se pueden cambiar.

    deli.directive('food', function () { return function (scope, element, attrs) { // post-linking function };});

    Antes de continuar, aquí hay una nota importante de la documentación de AngularJS que me gustaría que le echaras un vistazo:

    Nota: La instancia de la plantilla y la instancia del vínculo pueden ser objetos diferentes si la plantilla ha sido clonada. Por esta razón, no es seguro hacer nada más que transformaciones DOM que se apliquen a todos los nodos DOM clonados dentro de la función de compilación. Específicamente, el registro del oyente DOM debe realizarse en una función de enlace en lugar de en una función de compilación.

     

    Las funciones de compilación actualmente toman un tercer parámetro, una función de enlace de transclusión, pero está en desuso. Además, no debería alterar el DOM durante las funciones de compilación (en templateElement). Hágase un favor y evítelo compilepor completo; Proporciona funciones de pre-vinculación y post-vinculación directamente. La mayoría de las veces, una función de post-vinculación es suficiente, que es lo que estás usando cuando asignas una linkfunción al objeto de definición.

    Tengo una regla para ti aquí. Utilice siempre una función de post-enlace. Si es absolutamente necesario completar previamente un alcance antes de vincular el DOM, hágalo en la función de vinculación previa, pero vincule la funcionalidad en la función de vinculación posterior, como lo haría normalmente. Rara vez necesitarás hacer esto, pero creo que aún así vale la pena mencionarlo.

    link: { pre: function (scope, element, attrs, controller) { scope.requiredThing = [1, 2, 3]; }, post: function (scope, element, attrs, controller) { scope.squeal = function () { scope.$emit("squeal"); }; }}
    • controllerEsta es una instancia de controlador en la directiva.

    Las directivas pueden tener controladores, lo cual tiene sentido porque las directivas pueden crear un alcance. El controlador se comparte entre todas las directivas del alcance y se puede acceder a él como cuarto argumento al vincular funciones. Estos controladores son un canal de comunicación útil entre directivas del mismo nivel de alcance, que puede estar contenido en la propia directiva.

    • controllerAsEste es el alias del controlador al que hacer referencia en la plantilla.

    El uso de un alias de controlador le permite utilizar el controlador dentro de la propia plantilla, ya que estará disponible en el ámbito.

    • require¡Esto arrojará un error si no vincula alguna otra directiva en este elemento!

    La documentación requirees sorprendentemente sencilla, así que la haré trampa y la pegaré aquí:

    "Requiere otra directiva e inyecta su controlador como cuarto argumento de la función de enlace. Toma requireun nombre de cadena (o una matriz de cadenas) de las directivas para pasar. Si se usa una matriz, el argumento inyectado será un matriz en el orden correspondiente. Si no se puede encontrar dicha directiva, o si la directiva no tiene un controlador, entonces se genera un error. El nombre puede tener el prefijo:

    • (no prefix)Ubique el controlador requerido en el elemento actual. Lanza un error si no se encuentra
    • ?Intente localizar el controlador requerido o pase nullal linkfn si no lo encuentra
    • ^Localice el controlador requerido buscando en los padres del elemento. Lanza un error si no se encuentra
    • ?^Intente localizar el controlador requerido buscando en los padres del elemento o pase nullal linkfn si no lo encuentra"

    Require es útil cuando nuestra directiva depende de otras directivas para funcionar. Por ejemplo, es posible que tenga una directiva desplegable que dependa de una directiva de vista de lista o una directiva de diálogo de error que dependa de tener una directiva de mensaje de error. El siguiente ejemplo, por otro lado, define una needs-modeldirectiva que arroja un error si no encuentra un acompañamiento ng-model, presumiblemente porque needs-modelusa esa directiva o de alguna manera depende de que esté disponible en el elemento.

    angular.module('PonyDeli').directive(‘needsModel’, function () { return { require: 'ngModel’, }});
    div needs-model ng-model=’foo’/div
    • priorityEsto define el orden en el que se aplican las directivas.

    ¡Es hora de hacer trampa!

    "Cuando hay varias directivas definidas en un solo elemento DOM, a veces es necesario especificar el orden en el que se aplican las directivas. Se priorityutiliza para ordenar las directivas antes de que compilese llamen sus funciones. La prioridad se define como un número. Directivas con Los números mayores priorityse compilan primero. Las funciones previas al enlace también se ejecutan en orden de prioridad, pero las funciones posteriores al enlace se ejecutan en orden inverso. El orden de las directivas con la misma prioridad no está definido . La prioridad predeterminada es 0. "

    • terminalEsto impide una mayor tramitación de las directivas.

    "Si se establece en verdadero, entonces el actual priorityserá el último conjunto de directivas que se ejecutarán (cualquier directiva con la prioridad actu






    Tal vez te puede interesar:

    1. ¿Deberían abrirse los enlaces en ventanas nuevas?
    2. 24 excelentes tutoriales de AJAX
    3. 70 técnicas nuevas y útiles de AJAX y JavaScript
    4. Más de 45 excelentes recursos y repositorios de fragmentos de código

    Aspectos internos de AngularJS en profundidad, parte 2

    Aspectos internos de AngularJS en profundidad, parte 2

    ¿Qué diablos es una directiva?Crear una directivaÁmbitos infantiles juguetonesElige tu arma: @, o=Plantillas de vista sensibleClase magistral de tipografía

    programar

    es

    https://pseint.es/static/images/programar-aspectos-internos-de-angularjs-en-profundidad-857-0.jpg

    2024-05-20

     

    Aspectos internos de AngularJS en profundidad, parte 2
    Aspectos internos de AngularJS en profundidad, parte 2

    Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente

     

     

    Update cookies preferences