<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Andrea Carvajal López - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Andrea Carvajal López - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 15 Jun 2026 05:22:23 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/author/andrea/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Aprende a crear tu primera aplicación Angular en 20 minutos ]]>
                </title>
                <description>
                    <![CDATA[ Angular es un framework de JavaScript, creado por Misko Hevery y mantenido por Google. Esto es un modelo MVC (Controlador de Vista de Modelo). Puedes visita [https://angular.io/]r la página oficial [https://angular.io/] para aprender más sobre esto. En este momento, la última versión de Angular es 5.2.10. Hay primera [https://angularjs.org/] generación ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aprende-a-crear-tu-primera-aplicacion-angular-en-20-minutos/</link>
                <guid isPermaLink="false">6031880fbf5f3509ae10f1ae</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Carvajal López ]]>
                </dc:creator>
                <pubDate>Wed, 21 Apr 2021 04:37:26 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/0_WzYWvtV9CbhkCorg_.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Angular es un framework de JavaScript, creado por Misko Hevery y mantenido por Google. Esto es un modelo MVC (Controlador de Vista de Modelo). Puedes <a href="https://angular.io/" rel="noopener">visita</a><a href="https://angular.io/">r la página oficial</a> para aprender más sobre esto.</p><p>En este momento, la última versión de Angular es <strong><strong>5.2.10. </strong></strong>Hay <a href="https://angularjs.org/">primera</a><a href="https://angularjs.org/" rel="noopener"> generación 1.</a>x y <a href="https://angular.io/" rel="noopener">segunda generation 2.x</a>, y las dos generaciones son totalmente diferentes en su estructura y métodos. No te preocupes si te sientes confundido sobre la versión, porque en este artículo usaremos la segunda versión 2.x.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/hq0cvYK9ku0jw7BckSTe1bQyVtDh2PVSZeMu" class="kg-image" alt="hq0cvYK9ku0jw7BckSTe1bQyVtDh2PVSZeMu" width="600" height="403" loading="lazy"></figure><h4 id="tabla-de-contenido"><strong><strong><strong><strong>Tabl</strong></strong></strong>a de contenido</strong></h4><ul><li>Agregar un elemento (aprenda a enviar un formulario en Angular)</li><li>Eliminar un elemento (aprenda a agregar un evento en Angular)</li><li>Animación en Angular (aprenda a animar los componentes)</li></ul><h3 id="prerrequisitos-"><strong><strong>Pre</strong>r<strong>requisit</strong>os<strong>:</strong></strong></h3><ul><li><strong><strong>Node.js</strong></strong></li></ul><p>Revisa que node.js esté instalado en tu computador. <a href="https://nodejs.org/en/download/package-manager/">Aprende más sobre instalación</a>.</p><ul><li><strong><strong>npm</strong></strong></li></ul><p><strong><strong>npm</strong></strong> (administrador de paquetes de nodo) se instala con Node.js</p><p>Revisa la versión <strong><strong>node.js</strong></strong>:</p><pre><code>node -v</code></pre><p><strong><strong>npm:</strong></strong></p><pre><code>npm -v</code></pre><p><strong><strong>Angular-CLI</strong></strong></p><p>Deberías tener la última versión de Angular-CLI. Aprende más sobre <a href="https://angular.io/guide/quickstart" rel="noopener"><strong>a</strong></a><strong><a href="https://angular.io/guide/quickstart">quí</a><strong>, </strong></strong>y encuentra las instrucciones de instalación.</p><p>Instalar Angular-cli:</p><pre><code>npm install -g @angular/cli</code></pre><p>Y finalmente, deberías tener:</p><ul><li>Conocimiento básico de JavaScript</li><li>Fundamentos de HTML y CSS</li></ul><p>No es necesario tener ningún conocimiento de Angular.</p><p>Ahora que tenemos el entorno para ejecutar nuestra aplicación de Angular, !Comencemos¡</p><h3 id="creando-nuestra-primera-aplicaci-n"><strong>Creando nuestra primera aplicación</strong></h3><p>Usaremos angular-cli para crear y generar nuestros componentes. Generará servicios, enrutadores, componentes y directivas.</p><p>Para crear un nuevo proyecto Angular con Angular-cli, solo ejecuta:</p><pre><code>ng new my-app</code></pre><p>El proyecto se generará automáticamente. ¡Creemos nuestra aplicación de tareas pendientes!</p><pre><code>ng new todo-app</code></pre><p>Luego, abra los archivos en tu editor de texto. Yo uso Sublime, pero puedes escoger cualquier editor.</p><p>Así es como se ve la estructura de la aplicación:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/ptdxoFrfKYkg1O7Kjzfm2vfQxlsrM5ggfSoR" class="kg-image" alt="ptdxoFrfKYkg1O7Kjzfm2vfQxlsrM5ggfSoR" width="200" height="637" loading="lazy"></figure><p>No te preocupes si estás confundido sobre los archivos. Todo nuestro trabajo estará en la carpeta <strong><strong>app</strong></strong>. Contiene cinco archivos:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/icEs5nlfczvJiEgX7j4EUCcevZFnKCOXocqD" class="kg-image" alt="icEs5nlfczvJiEgX7j4EUCcevZFnKCOXocqD" width="234" height="89" loading="lazy"></figure><blockquote>Nota: Angular 2 usa<a href="https://www.typescriptlang.org/" rel="noopener"> <strong><strong>TypeScript</strong></strong></a>, en que los archivos terminan con la extensión “<strong><strong>.ts”</strong></strong>.</blockquote><p>Para crear una interfaz agradable para nuestra aplicación, usaremos la Framework <a href="http://getbootstrap.com/" rel="noopener">Bootstrap 4</a>.</p><p>Incluir bootstrap<strong><strong> cdn</strong></strong> en <strong><strong>index.html</strong></strong>:</p><pre><code>&lt;link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"&gt;</code></pre><p>correr la aplicación en tu terminal:</p><pre><code>ng serve</code></pre><p>La aplicación correrá en <a href="http://localhost:4200/" rel="noopener">http://localhost:4200/</a></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/gwml-v8qHlrNVra-yfJOZH1Kdqx2oRnwrWYF" class="kg-image" alt="gwml-v8qHlrNVra-yfJOZH1Kdqx2oRnwrWYF" width="366" height="717" loading="lazy"></figure><p>¡¿Todo está bien?!</p><p>Ahora hagamos una estructuración HTML. Usaremos clases de Bootstrap para crear un formulario simple.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/ioyTYMvqC7Izykcin7U1OAEE9pIO7Tn9CWGB" class="kg-image" alt="ioyTYMvqC7Izykcin7U1OAEE9pIO7Tn9CWGB" width="471" height="398" loading="lazy"></figure><p><strong><strong>app.component.html</strong></strong>:</p><pre><code>&lt;div class="container"&gt; &lt;form&gt;  &lt;div class="form-group"&gt;  &lt;h1 class="text-center text-primary"&gt;Todo App&lt;/h1&gt;   &lt;div class="input-group-prepend"&gt;       &lt;input type="text" class="form-control" placeholder="Add Todo" name="todo"&gt;    &lt;span class="input-group-text"&gt;Add&lt;/span&gt;   &lt;/div&gt;  &lt;/div&gt; &lt;/form&gt;&lt;/div&gt;</code></pre><p>En <strong><strong>app.component.css</strong></strong>:</p><pre><code>body{ padding: 0; margin: 0;</code></pre><pre><code>}form{ max-width: 25em; margin: 1em auto;}</code></pre><p>Para calcular el valor de entrada en Angular 2, podemos usar la directiva <strong><strong>ngMode</strong>l</strong>. Puedes insertar una variable como un atributo dentro del elemento de entrada.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/9x5e9yWah1OqD5OpVTfMAxz5fzEjn1e3jLjD" class="kg-image" alt="9x5e9yWah1OqD5OpVTfMAxz5fzEjn1e3jLjD" width="341" height="224" loading="lazy"></figure><pre><code>&lt;input type="text" #todo class="form-control" placeholder="Add Todo" name="todo" ngModel&gt;</code></pre><p>Para crear una variable como un atributo, usa # seguido por el nombre de la variable.</p><pre><code>&lt;input #myVariable type="text" name="text" ngModel&gt;</code></pre><pre><code>// get the value of the Variable&lt;p&gt;{{myVariable.value}}&lt;/p&gt;</code></pre><p>Ahora obtén el valor de la variable “todo”:</p><pre><code>&lt;p&gt;{{todo.value}}&lt;/p&gt;</code></pre><p>¡¿Todo está bien?!</p><p>Ahora tenemos que almacenar el valor capturado en la entrada. Podemos crear un arreglo vacío en <strong><strong>app.component.ts </strong></strong>dentro de la clase AppComponent:</p><pre><code>export class AppComponent {  todoArray=[] }</code></pre><p>Luego tenemos que agregar un evento de clic a nuestro botón que empuja el valor capturado en “<strong><strong>todoArray</strong></strong>”.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/YiBkAM7A8VteVRe3Ok0KBWaVscJ1QRk9ciL9" class="kg-image" alt="YiBkAM7A8VteVRe3Ok0KBWaVscJ1QRk9ciL9" width="508" height="309" loading="lazy"></figure><p><strong><strong>app.component.html</strong></strong>:</p><pre><code>&lt;span class="input-group-text" (click)="addTodo(todo.value)"&gt;Add&lt;/span&gt;</code></pre><p>En <strong><strong>app.component.ts</strong></strong>:</p><pre><code>export class AppComponent { todoArray=[]</code></pre><pre><code>addTodo(value){    this.todoArray.push(value)    console.log(this.todos)  } }</code></pre><blockquote>Usa console.log(this.todoArray) para ver el valor de Array </blockquote><h4 id="obtener-datos-de-todoarray-"><strong>Obtener datos de<strong> “todoArray”</strong></strong></h4><p>Ahora tenemos que recuperar los datos guardados en “todosArray.” Usaremos *<a href="https://angular.io/guide/structural-directives" rel="noopener"><strong><strong>ngFor directive </strong></strong></a><strong> </strong> para recorrer el arreglo y extraer los datos. </p><p>app.component.html:</p><pre><code>&lt;div class="data"&gt;  &lt;ul class="list-instyled"&gt;   &lt;li *ngFor="let todo of todoArray"&gt;{{todo}}&lt;/li&gt;  &lt;/ul&gt;  &lt;/div&gt;</code></pre><p>Después de recuperar los datos:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/IdbbBDKFN29rGZisR0ygAKwKdTUPexZ7-hYD" class="kg-image" alt="IdbbBDKFN29rGZisR0ygAKwKdTUPexZ7-hYD" width="526" height="303" loading="lazy"></figure><p>Los datos ahora se recuperarán automáticamente cuando hagamos clic en el botón Agregar. </p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/Yyeff6WTcxF-b39yi6zMtpe9UWzjZ9NhZBWs" class="kg-image" alt="Yyeff6WTcxF-b39yi6zMtpe9UWzjZ9NhZBWs" width="600" height="410" loading="lazy"></figure><h4 id="dise-ando-la-aplicaci-n"><strong>Diseñando la aplicación</strong></h4><p>Me gusta usar <a href="https://fonts.google.com/">Google-fonts</a> y los &nbsp;<a href="https://material.io/icons/">Íconos de </a><a href="https://material.io/icons/" rel="noopener">Material</a>, que son de uso gratuito.</p><p>Incluye las fuentes de Google-fonts dentro de <strong><strong>app.component.css</strong></strong>:</p><pre><code>/*Google fonts*/@import url('https://fonts.googleapis.com/css?family=Raleway');</code></pre><p>Y los íconos de materiales dentro de <strong><strong>index.html</strong></strong>:</p><pre><code>&lt;link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"&gt;</code></pre><p>Después de agregar algo de estilo a nuestra aplicación, esta se verá así: </p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/Bb8mPSgYnJuwIEHA3-cRc8yR0q1YId96ppmi" class="kg-image" alt="Bb8mPSgYnJuwIEHA3-cRc8yR0q1YId96ppmi" width="678" height="624" loading="lazy"></figure><p>Para usar los íconos de material:</p><pre><code>&lt;i class="material-icons&gt;iconName&lt;/i&gt;</code></pre><p>Agrega los íconos “delete” y “add” en <strong><strong>app.component.html</strong></strong>:</p><pre><code>// put add icon inside  "input-group-text" div</code></pre><pre><code>&lt;span class="input-group-text" (click)="addTodo(todo.value)"&gt;&lt;i class="material-icons"&gt;add&lt;/i&gt;&lt;/span&gt;</code></pre><pre><code>// and delete icon inside list item &lt;li *ngFor="let todo of todoArray"&gt;{{todo}}&lt;i class="material-icons"&gt;delete&lt;/i&gt;&lt;/li&gt;</code></pre><p>Para estilos en <strong><strong>app.component.css</strong></strong>:</p><pre><code>/*Google fonts*/@import url('https://fonts.googleapis.com/css?family=Raleway');</code></pre><pre><code>body{ padding: 0; margin: 0;</code></pre><pre><code>}form{ max-width: 30em; margin: 4em auto; position: relative; background: #f4f4f4; padding: 2em 3em;}form h1{    font-family: "Raleway";    color:#F97300; }form input[type=text]::placeholder{   font-family: "Raleway";   color:#666; }form .data{    margin-top: 1em;}form .data li{ background: #fff; border-left: 4px solid #F97300; padding: 1em; margin: 1em auto; color: #666; font-family: "Raleway";}form .data li i{    float: right;    color: #888;    cursor: pointer;}form .input-group-text{    background: #F97300;    border-radius: 50%;    width: 5em;    height: 5em;    padding: 1em 23px;    color: #fff;    position: absolute;    right: 13px;    top: 68px;    cursor: pointer;}form .input-group-text i{    font-size: 2em;}form .form-control{ height: 3em;    font-family: "Raleway";}form .form-control:focus{ box-shadow: 0;}</code></pre><p>Nuestra aplicación está casi lista, pero necesitamos agregar algunas funciones. Una función de Eliminación debería permitir a los usuarios hacer clic en el ícono Eliminación y eliminar un elemento. También sería genial tener la opción de ingresar un nuevo artículo con la clave de retorno, en lugar de hacer clic en el botón Agregar. </p><p><strong>Eliminar elementos:</strong></p><p>Para agregar la funcionalidad de eliminación, usaremos el método de arreglo "empalme" &nbsp;y un bucle for. Recorreremos &nbsp;“todoarray” y extraeremos el elemento que queremos eliminar.</p><p>Agrega un evento (clic) para eliminar el ícono y darle “todo” como parámetro:</p><pre><code>&lt;li *ngFor="let todo of todoArray"&gt;{{todo}} &lt;i (click)="deleteItem(todo)" class="material-icons"&gt;delete&lt;/i&gt;&lt;/li&gt;</code></pre><p>En <strong><strong>app.component.ts</strong></strong>:</p><pre><code>/*delete item*/  deleteItem(){   console.log("delete item")  }</code></pre><p>Cuando haces clic en Eliminar, esto debería aparecer en la consola:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/nWS2NAJXn4iaQL6vqGwiaUBVSY64XUxerN4w" class="kg-image" alt="nWS2NAJXn4iaQL6vqGwiaUBVSY64XUxerN4w" width="488" height="186" loading="lazy"></figure><p>Ahora tenemos que recorrer “todoArray” y empalmar el elemento en el que hicimos clic.</p><p>En <strong><strong>app.component.ts</strong></strong>:</p><pre><code>/*delete item*/  deleteItem(todo){   for(let i=0 ;i&lt;= this.todoArray.length ;i++){    if(todo== this.todoArray[i]){     this.todoArray.splice(i,1)    }   }  }</code></pre><p>El resultado:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/bJVYplDX6DgQ39ZaN3eYhBcenCi86fqxbov0" class="kg-image" alt="bJVYplDX6DgQ39ZaN3eYhBcenCi86fqxbov0" width="600" height="594" loading="lazy"></figure><p>¡¡¿Increible ?!!</p><h4 id="ingresando-para-agregar-elementos"><strong>Ingresando para agregar elementos</strong></h4><p>Podemos agregar un evento de envío de formulario:</p><pre><code>(ngSubmit)="TodoSubmit()"</code></pre><p>Necesitamos agregar la variable “#todoForm” al formulario y darle “ngForm” como valor. En este caso, solo tenemos un campo, por lo que obtendremos un solo valor. Si tenemos varios campos, el evento de envío devolverá los valores de todos los campos del formulario.</p><p><strong><strong>app.component.html</strong></strong></p><pre><code>&lt;form #todoForm= "ngForm" (ngSubmit)="todoSubmit(todoForm.value)"&gt;&lt;/form&gt;</code></pre><p>en<strong><strong> app.component.ts</strong></strong></p><pre><code>// submit Form  todoSubmit(value:any){ console.log(value)  }</code></pre><p>Verifica la consola. Devolverá un objeto de valores:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/HBlkb6jnVHcHyTGJ1lEff1dcy2ok-T7glk42" class="kg-image" alt="HBlkb6jnVHcHyTGJ1lEff1dcy2ok-T7glk42" width="311" height="204" loading="lazy"></figure><p>Así que ahora tenemos que enviar el valor devuelto a "todoArray":</p><pre><code>// submit Form  todoSubmit(value:any){     if(value!==""){    this.todoArray.push(value.todo)     //this.todoForm.reset()    }else{      alert('Field required **')    }      }</code></pre><p>¿Aquí estamos?. El valor se inserta sin necesidad de hacer clic en el botón Agregar, simplemente haciendo clic en "Enter":</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/OWpohuUVC7SjOCGfavFkTnoU2D1sR1CgQj8r" class="kg-image" alt="OWpohuUVC7SjOCGfavFkTnoU2D1sR1CgQj8r" width="600" height="594" loading="lazy"></figure><p>Una cosa más. Para restablecer el formulario después de enviarlo, agregue el método incorporado "resetForm ()" para enviar el evento.</p><pre><code>&lt;form #todoForm= "ngForm" (ngSubmit)="todoSubmit(todoForm.value); todoForm.resetForm()" &gt;&lt;/form&gt;</code></pre><p>El formulario se restablecerá después de cada envío ahora:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/0w5t7IIt4Wj4KBolctdZBNFQrwr4ucCLL6or" class="kg-image" alt="0w5t7IIt4Wj4KBolctdZBNFQrwr4ucCLL6or" width="600" height="594" loading="lazy"></figure><h4 id="agregar-animaciones"><strong><strong>A</strong>gregar animaciones</strong></h4><p><br>Me gusta agregar un pequeño toque de animaciones. Para agregar animación, importe los componentes de animaciones en su <strong><strong>app.component.ts</strong></strong>:</p><pre><code>import { Component,trigger,animate,style,transition,keyframes } from '@angular/core';</code></pre><p>Luego agregue la propiedad de animaciones al decorador "@component":</p><pre><code>@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.css'],  animations:[   trigger("moveInLeft",[      transition("void=&gt; *",[style({transform:"translateX(300px)"}),        animate(200,keyframes([         style({transform:"translateX(300px)"}),         style({transform:"translateX(0)"})           ]))]),</code></pre><pre><code>transition("*=&gt;void",[style({transform:"translateX(0px)"}),        animate(100,keyframes([         style({transform:"translateX(0px)"}),         style({transform:"translateX(300px)"})           ]))])             ])</code></pre><pre><code>]})</code></pre><p>Ahora los elementos tienen un buen efecto cuando se ingresan y eliminan.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/4ugLJyeDD6oGnKg6jc47KqRc692d4H376pqr" class="kg-image" alt="4ugLJyeDD6oGnKg6jc47KqRc692d4H376pqr" width="600" height="334" loading="lazy"></figure><h3 id="todo-el-c-digo"><strong>Todo el<strong> c</strong>ódigo</strong></h3><p><strong><strong>app.component.ts</strong></strong></p><pre><code>import { Component,trigger,animate,style,transition,keyframes } from '@angular/core';</code></pre><pre><code>@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.css'],  animations:[   trigger("moveInLeft",[      transition("void=&gt; *",[style({transform:"translateX(300px)"}),        animate(200,keyframes([         style({transform:"translateX(300px)"}),         style({transform:"translateX(0)"})           ]))]),</code></pre><pre><code>transition("*=&gt;void",[style({transform:"translateX(0px)"}),        animate(100,keyframes([         style({transform:"translateX(0px)"}),         style({transform:"translateX(300px)"})           ]))])             ])</code></pre><pre><code>]})export class AppComponent {  todoArray=[];  todo;  //todoForm: new FormGroup()</code></pre><pre><code>addTodo(value){    if(value!==""){     this.todoArray.push(value)    //console.log(this.todos)   }else{    alert('Field required **')  }      }</code></pre><pre><code>/*delete item*/  deleteItem(todo){   for(let i=0 ;i&lt;= this.todoArray.length ;i++){    if(todo== this.todoArray[i]){     this.todoArray.splice(i,1)    }   }  }</code></pre><pre><code>// submit Form  todoSubmit(value:any){     if(value!==""){    this.todoArray.push(value.todo)     //this.todoForm.reset()    }else{      alert('Field required **')    }      } }</code></pre><p><strong><strong>app.component.html</strong></strong></p><pre><code>&lt;div class="container"&gt; &lt;form #todoForm= "ngForm"(submit)="todoSubmit(todoForm.value); todoForm.resetForm()" &gt;  &lt;div class="form-group"&gt;  &lt;h1 class="text-center "&gt;Todo App&lt;/h1&gt;   &lt;div class="input-group-prepend"&gt;       &lt;input type="text" #todo  class="form-control" placeholder="Add Todo" name="todo" ngModel&gt;    &lt;span class="input-group-text" (click)="addTodo(todo.value)"&gt;    &lt;i class="material-icons"&gt;add&lt;/i&gt;&lt;/span&gt;   &lt;/div&gt;  &lt;/div&gt;  &lt;div class="data"&gt;  &lt;ul class="list-unstyled"&gt;   &lt;li [@moveInLeft]  *ngFor="let todo of todoArray"&gt;{{todo}} &lt;i (click)="deleteItem(todo)" class="material-icons"&gt;delete&lt;/i&gt;&lt;/li&gt;  &lt;/ul&gt; &lt;/div&gt; &lt;/form&gt;&lt;/div&gt;</code></pre><p><strong><strong>app.component.css</strong></strong></p><pre><code>/*Google fonts*/@import url('https://fonts.googleapis.com/css?family=Raleway');</code></pre><pre><code>body{ padding: 0; margin: 0;</code></pre><pre><code>}form{ max-width: 30em; margin: 4em auto; position: relative;    background: #f4f4f4;    padding: 2em 3em;    overflow: hidden;}form h1{    font-family: "Raleway";    color:#F97300; }form input[type=text]::placeholder{   font-family: "Raleway";   color:#666; }form .data{    margin-top: 1em;}form .data li{ background: #fff; border-left: 4px solid #F97300; padding: 1em; margin: 1em auto; color: #666; font-family: "Raleway";}form .data li i{    float: right;    color: #888;    cursor: pointer;}form .input-group-text{    background: #F97300;    border-radius: 50%;    width: 5em;    height: 5em;    padding: 1em 23px;    color: #fff;    position: absolute;    right: 13px;    top: 68px;    cursor: pointer;}form .input-group-text i{    font-size: 2em;}form .form-control{ height: 3em;    font-family: "Raleway";}form .form-control:focus{ box-shadow: 0;}</code></pre><p>¿ Hemos terminado ?. Puedes encontrar los archivos y el código en <a href="https://github.com/hayanisaid/Todo-app-in-Angular" rel="noopener">Github.</a></p><h4 id="mira-el-demo"><strong><a href="https://stackblitz.com/edit/todo-app-in-angular?file=index.html" rel="noopener">M</a><a href="https://stackblitz.com/edit/todo-app-in-angular?file=index.html">ira el<strong></strong></a><strong><a href="https://stackblitz.com/edit/todo-app-in-angular?file=index.html" rel="noopener"> </a></strong><strong><a href="https://stackblitz.com/edit/todo-app-in-angular?file=index.html" rel="noopener">Demo</a></strong></strong></h4><h3 id="conclusi-n"><strong><strong>Conclusi</strong>ó<strong>n</strong></strong></h3><p>Angular es más fácil de lo que crees. Angular es una de las mejores bibliotecas de JavaScript y tiene un gran soporte y una buena comunidad. También tiene herramientas que hacen que trabajar con Angular sea rápido y fácil, como Angular-cli.</p><p>Suscríbete en esta lista de<a href="http://eepurl.com/dk9OJL" rel="noopener"> mail</a> para aprender más &nbsp;sobreAngular.</p><p><a href="https://twitter.com/hayanisaid1995" rel="noopener"><strong><strong>SaidHayani@ (@hayanisaid1995) | Twitter</strong></strong></a><br><a href="https://twitter.com/hayanisaid1995" rel="noopener"><em>L</em></a><em>os últimos tweets de</em><a href="https://twitter.com/hayanisaid1995" rel="noopener"><em><em> SaidHayani@ (@hayanisaid1995). #Web_Developer /#Frontend / #Back_end(#PHP &amp;…</em></em>twitter.com</a></p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/saidhayani/">Said Hayani - freeCodeCamp.org</a> - <a href="https://www.freecodecamp.org/news/learn-how-to-create-your-first-angular-app-in-20-min-146201d9b5a7/">Learn how to create your first Angular app in 20 minutes (freecodecamp.org)</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo compartir variables en HTML, CSS, y JavaScript usando Webpack ]]>
                </title>
                <description>
                    <![CDATA[ A principios de esta semana, leí un artículo que explica cómo CSS-in-JS ralentiza la representación de algunas aplicaciones React y cómo el CSS estático es más rápido. Pero CSS-in-JS es muy popular porque, entre otras características, puede diseñar dinámicamente usando variables de JavaScript. En este tutorial, te mostraré cómo recrear ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-compartir-variables-en-html-y-javascript-usando-webpack/</link>
                <guid isPermaLink="false">5fff7d2ea4e0700982a9d673</guid>
                
                    <category>
                        <![CDATA[ Webpack ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrea Carvajal López ]]>
                </dc:creator>
                <pubDate>Wed, 14 Apr 2021 05:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/04/4kzz7px14mtv34rcfp73-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A principios de esta semana, leí un artículo que explica cómo CSS-in-JS ralentiza la representación de algunas aplicaciones React y cómo el CSS estático es más rápido. Pero CSS-in-JS es muy popular porque, entre otras características, puede diseñar dinámicamente usando variables de JavaScript.</p><p>En este tutorial, te mostraré cómo recrear este beneficio en cualquiera de tus proyectos web gracias a Webpack (y supongo que sabes cómo usarlo). Para empezar, queremos que Webpack agrupe nuestros archivos fuente en una carpeta <code>dist/</code> estática.</p><p><a href="https://glitch.com/~shared-variables-webpack"></a><a href="https://glitch.com/~shared-variables-webpack">P</a>uedes revisar el código fuente aquí.</p><h2 id="1-configura-nuestra-aplicaci-n"><strong>1. Configura nuestra aplicación</strong></h2><h3 id="la-parte-aburrida"><strong>La parte aburrida</strong></h3><p>Crea una carpeta para este tutorial, abre tu terminal, e inicia un proyecto:</p><pre><code>npm init -y
</code></pre><p>Lo primero es lo primero, si aún no está hecho, instala <a href="https://nodejs.org/en/">node.js</a> y <a href="https://webpack.js.org/">Webpack</a>:</p><pre><code>npm install webpack webpack-cli --save-dev
</code></pre><p>Vamos a crear un script en nuestro <code>package.json</code> que le dice a Webpack que use nuestro archivo de configuración:</p><pre><code class="language-json">  "scripts": {
    "build": "webpack --config webpack.config.js"
  }
</code></pre><p>En la root de tu carpeta, cree un archivo <code>globals.js</code>, donde nuestras variables serán guardadas:</p><pre><code class="language-javascript">module.exports = {
  myTitle: 'Hello freeCodeCamp!',
  myColor: '#42ff87',
};
</code></pre><p>El archivo de configuración de Webpack se ve así (<code>webpack.config.js</code>). Créelo en el root de tu carpeta:</p><pre><code class="language-javascript">module.exports = {
  entry: __dirname + '/app/index.js',
  output: {
    path: __dirname + '/dist',
    filename: 'index_bundle.js'
  },
};
</code></pre><p>Nuestro código fuente estará ubicado en una carpeta <code>app</code>. Créelo de esta forma:</p><pre><code>mkdir app &amp;&amp; cd app
</code></pre><p>Necesitarás <code>index.html</code> y <code>index.js</code> archivos en este punto. Crea estos archivos en la carpeta <code>app</code>:</p><pre><code>touch index.html index.js
</code></pre><p>¡Perfecto! ¿Ya está todo listo?</p><p>Tu carpeta debería verse así:</p><pre><code>|-- node_modules/
|-- package.json
|-- webpack.config.js
|-- globals.js
|-- app/
	|-- index.html
	|-- index.js
</code></pre><h2 id="2-renderiza-nuestros-archivos-html-con-el-html-webpack-plugin"><strong>2. Renderiza nuestros archivos HTML con el <code>html-webpack-plugin</code></strong></h2><p>Esta <code>app/index.html</code> está vacía. Vamos a añadir algo de marcado en él y luego agregue una variable personalizada:</p><pre><code class="language-html">&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;title&gt;Webpack shared variables!&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;&lt;%= myTitle %&gt;&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Como puedes ver, estamos tratando de imprimir una variable en nuestro HTML... ¡Lo cual es imposible! Para hacer que funciones usaremos el <a href="https://github.com/jantimon/html-webpack-plugin">html-webpack-plugin</a> que nos brinda la habilidad de usar la sintaxis <a href="https://ejs.co/">EJS</a> e <strong><strong>i</strong>nyectar datos en el</strong>.</p><p>El complemento generará un archivo HTML válido. Mientras tanto, debes cambiar el nombre de tu archivo <code>app/index.html</code> a <code>app/index.ejs</code>.</p><pre><code>npm install --save-dev html-webpack-plugin
</code></pre><p>Volvamos a nuestro archivo de configuración. <code>html-webpack-plugin</code> tiene una interesante opción <code>templateParameters</code> que nos permite pasar un objeto como parámetro. Habilita el complemento de la siguiente manera en <code>webpack.config.js</code>:</p><pre><code class="language-javascript">const HtmlWebpackPlugin = require('html-webpack-plugin');
const globals = require('./globals.js')

module.exports = {
	// ... previous config, entry, output...
  plugins: [
    new HtmlWebpackPlugin({
      template: 'app/index.ejs',
      templateParameters: globals,
    })
  ]
};
</code></pre><p>Corre <code>npm run build</code> y <em><em>ta-daaaaa</em></em> « &lt;%= myTitle %&gt; » se convirtió « Hello freeCodeCamp » ! El trabajo está hecho por Webpack durante la compilación cuando corre el &nbsp;<code>html-webpack-plugin</code>.</p><p>¿Ves? Esto fue bastante sencillo con la herramienta correcta: HTML ✅</p><h2 id="3-usa-nuestras-variables-en-javascript"><strong>3. &nbsp;Usa nuestras variables en JavaScript</strong></h2><p>¡Uf, tantas líneas solo para imprimir una variable! ? Con Webpack, las cosas a menudo se complican. Bueno, esta es muy simple: en JavaScript simplemente importa tu archivo. En tu <code>app/index.js</code>:</p><pre><code class="language-javascript">import globals from '../globals.js'

document.write(
'&lt;pre&gt;' +
  JSON.stringify(globals, null, 2) +
'&lt;/pre&gt;'
);
</code></pre><p>Esta imprimirá nuestros objetos globales en la página. Ahora pasemos al CSS.</p><h2 id="4-usa-variables-compartidas-en-nuestro-css"><strong>4. Usa variables compartidas en nuestro CSS</strong></h2><p>¿Aquí es nuestro final jefe?</p><p>De acuerdo, chicos, me atraparon… Mentí. No podemos usar nuestros globales en CSS &nbsp;– Tenemos que usar un preprocesador. En este ejemplo, usaremos <a href="https://sass-lang.com/">SASS</a>.</p><p>En lado de Webpack, un complemento no será suficiente. Tenemos que usar un <a href="https://webpack.js.org/loaders/">cargado</a><a href="https://webpack.js.org/loaders/">r</a> para convertir SASS en CSS. En este caso necesitamos el paquete de <a href="https://github.com/webpack-contrib/sass-loader">sass-loader</a>, así que instálalo de acuerdo con los documentos: </p><pre><code>npm install sass-loader node-sass css-loader style-loader --save-dev
</code></pre><p>De vuelta a la codificación. Ahora que tenemos SASS, crea tu archivo de hoja de estilo, <code>app/style.scss</code>:</p><pre><code class="language-scss">h1 {
  color: $myColor;
}
</code></pre><p>Nuestro SASS está configurado – ahora, cómo podemos inyectarle datos? ¡El paquete <code>sass-loader</code> tiene una opción <a href="https://github.com/webpack-contrib/sass-loader#prependdata">anteponer datos</a>! Pero toma una cadena como parámetro, lo cual significa que tus datos deberían verse así: <code>"$myColor: red; myTitle: '...'";</code>.</p><p>Teneos que automatizar eso y convertir un objeto de JavaScript en una cadena. No encontré un paquete en &nbsp;<code>npm</code> que me satisficiera, entonces escribí <a href="https://gist.github.com/adrienZ/0257e37bf4788b903ba76fa82dac1ed1">mi propio convertidor</a>. Descarga el archivo y agrégalo en tu proyecto (en mi ejemplo es <code>utils/jsToScss.js</code>).</p><p>Tu final <code>webpack.config.js</code> debería verse así:</p><pre><code class="language-javascript">const globals = require("./globals.js");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const jsToScss = require("./utils/jsToScss.js");

module.exports = {
  entry: __dirname + "/app/index.js",
  output: {
    path: __dirname + "/dist",
    filename: "index_bundle.js"
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "app/index.ejs",
      templateParameters: globals
    })
  ],
  module: {
    rules: [
      {
        test: /\.s[ac]ss$/i,
        use: [
          // Creates `style` nodes from JS strings
          "style-loader",
          // Translates CSS into CommonJS
          "css-loader",
          // Compiles Sass to CSS
          {
            loader: "sass-loader",
            options: {
              prependData: jsToScss(globals)
            }
          }
        ]
      }
    ]
  }
};
</code></pre><p>Esto es lo que debería ver:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/12/Capture-d-e-cran-2019-12-23-23.44.11.png" class="kg-image" alt="Capture-d-e-cran-2019-12-23-23.44.11" width="600" height="400" loading="lazy"><figcaption><a href="https://glitch.com/edit/#!/shared-variables-webpack?path=webpack.config.js" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 15.2px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://glitch.com/edit/#!/shared-variables-webpack?path=webpack.config.js</a></figcaption></figure><p>Si todavía estás leyendo este tutorial, gracias por tu atención. ¡Espero que te ayude! Webpack es una poderosa herramienta que deberías profundizar. </p><p>NB: en tu carpeta <code>dist/</code> puedes ver que no se genera ningún CSS. Eso es porque uso el <code>style-loader</code> para mantener este demo simple. Para generar el archivo CSS, echa un vistazo a la <a href="https://webpack.js.org/plugins/mini-css-extract-plugin/">mini-css-extract-plugin</a>.</p><p>Traducido del artículo de: <strong><a href="https://www.freecodecamp.org/news/author/adri_zag/">Adrien Zaganelli</a> -</strong> <strong><a href="https://www.freecodecamp.org/news/how-to-share-variables-across-html-css-and-javascript-using-webpack/">How to share variables across HTML, CSS, and JavaScript using Webpack</a></strong></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
