> For the complete documentation index, see [llms.txt](https://ng-girls-colombia.gitbook.io/workshop/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ng-girls-colombia.gitbook.io/workshop/desafio-4-tbd.md).

# Desafío #4: 🧠 Quiz

## ¡**Comparte tu progreso!** 📱

Si te ha gustado lo que has hecho hasta ahora, compártelo con tus amigos y familiares 👨‍👩‍👧‍👧

Haz click al botón **SHARE** y envía la **APP URL** para que todos vean tu increíble trabajo.

![](https://lh6.googleusercontent.com/n2GUhi9BD5ZjSL89ZAz2qy6Pr0X7Hp6y_hV75ZL8JYJQnDlTxQQhv5YiI4KUAYrqSlkPCZEraqJzvVqh_ixNmDCqaxjzSye4R_leJ3SbNfYFXosWoKYafJpdcSY_skN1wiNW3azN)

### Paso #1 🔥

¡Ahora vamos a crear un proyecto nuevo! Para hacerlo solo basta con:

1. Abrir una nueva página
2. Ir a [**stackblitz.com**](https://stackblitz.com/)
3. Y seleccionar la opción de **Angular**

### **Paso #2** 👩‍🎨

Vamos a borrar todo el contenido de `app.component.html`. Y luego copiamos dentro de una etiqueta `h1` nuestra primera y única pregunta:

```markup
<h1>¿Te ha gustado NgGirls hasta el momento?</h1>
```

![](https://lh3.googleusercontent.com/hkBj-5jgNyvCoyE_QQTgaWmsl1pv2iDpV20nua_xBIB5_FG9co8CTWSlboxRtBTDYu8R_1lw7FpDYDiUl4JVg42flF9KjVC4RuV8uEcuPDDvdlKJAP70qgLdmKcodMea2OU9LRRp)

Agreguemos las opciones de respuesta **(Sí y No)** con la etiqueta `button` de HTML:

```markup
<button>Sí</button>
<button>No</button>
```

![](https://lh4.googleusercontent.com/yH5bT5DaVPYbIqgwbzk6n5f_9BwazrSstpYbkXIAUIe98y5gunvSD1nD8BZRuNhU0lF91bvgTuTwxSMIdVvWZMi_KSAgtTDGoqXgBZrsWsv6BPPpwibZmB_PLPF5GZxMwsp_-wJU)

Utilizamos botones para mostrar tu respuesta 👇.

### **Paso #3** 🤹‍

No siempre vamos a querer que nuestro texto esté escrito directamente en el **HTML**, por lo general debemos guardar esos textos en **variables** para poder cambiar los mensajes de manera más dinámica a través de código. 😉

Una de las funcionalidad más geniales de Angular se llama **String Interpolation**. Ésta te permite enlazar tus **variables** al HTML:

1. Abre el archivo `app.component.ts`&#x20;
2. Allí hay una variable llamada `name`. Vamos a cambiar su nombre a `question`&#x20;
3. Y vamos a reemplazar su valor con una pregunta

```typescript
question = "¿Te ha gustado NgGirls hasta el momento?"
```

![](https://lh6.googleusercontent.com/sZiRBcavN783oifkAVxtDhtKn1tOl9kZcbjONBCxfzq8nMjU-LEHtBruUcvHdbElK8N9BhVJyVImqAmCm56mSPvIK7Dn3zIOPVQHwGpia1IN3sQvrHA7EHX6qoqNNPXUPDXOmZ4M)

Luego, en `app.component.html` cambiamos el texto de la pregunta por la variable `question`, haciendo uso de **string interpolation:**

```markup
<h1>{{ question }}</h1>
```

![](https://lh6.googleusercontent.com/GKN8LvPkgejB_ou9nBcrFUMYfahh3edTYEPu1sIc7JNWmJq6_sgZH0Y6sDcZigotIgLZTKpbHOmqScczBC5BOSNWWytSO0Ul7jZx2k1QHkYbzr-5ocn9HFEEO6dTsS3qxgNhSZTc)

{% hint style="info" %}
Si justo ahora tienes alguna pregunta, no olvides que tienes excelentes mentores a quienes puedes preguntarles 😏
{% endhint %}

### **Paso #4** 😺

Como habrás notado, **String Interpolation** es bastante fácil ✌️. Ahora vamos a crear una función 🔥.

Una función en programación es simplemente una manera de definir una serie de acciones que queremos que se lleven a cabo en cierto momento.

{% hint style="info" %}
Por ejemplo, si estuviéramos creando una calculadora, lo más seguro es que tendríamos funciones como: sumar, restar, dividir, etc.&#x20;
{% endhint %}

En este caso vamos a crear una función llamada **answer ✌️**. El propósito de esta función es guardar en una variable la respuesta que selecciones al presionar los botones (sí o no).

Por supuesto, dependiendo del botón que sea presionado, vamos a almacenar una valor diferente. Para esto simplemente le agregaremos un parámetro a la función. Lo llamaremos **value 🔮**

En `app.component.ts` creamos la función  `answer` con el parámetro `value`

![](/files/-LL0aCA18XmRiQeEeUIW)

Ahora vamos a crear una variable donde podamos almacenar la respuesta seleccionada. A esta variable la vamos a llamar `response` 📜

Nota que en nuestra función asignamos el valor del parámetro `value` a la variable `response`

![](/files/-LL0aIfI7tVCEY_vdLzz)

### **Paso #5** 🎬

¡Listo! Nuestra función está lista 🎉 Es momento de hacer uso de ella cuando el usuario presione alguno de los dos botones.

Para capturar la acción del usuario podemos utilizar **Event Binding.** Un mecanismo que nos proporciona Angular para llamar funciones desde el HTML.

Sólo basta con poner la palabra `click` entre paréntesis y asignarle la función que deseamos llamar entre comillas dobles:

```markup
<button (click)="answer('Si')"> Si </button>
```

Nota cómo pasamos el valor `sí` entre comillas simples en el archivo `app.component.html`

![](/files/-LL0aUCEb3voCmTQGWrR)

{% hint style="info" %}
💪 Ahora es tu turno de agregar el evento **click** al botón **No 💪**
{% endhint %}

### **Paso #6** ✍

Sólo nos falta usar **String Interpolation** para mostrar el resultado. Agreguemos la etiqueta `h1` con la variable `response`

```markup
<h1> {{ response }} </h1>
```

![](/files/-LL0aaQTIC6wpTzrcCmd)

Cuando le des click a alguno de los botones debería verse así:

![](/files/-LL0afiARBck3CP1YX_p)

### **Paso #7** 🤡

¡Éste es el último paso!

Vamos a hacerlo más divertido agregando un emoji con una carita **feliz** (😃) o **triste** (😭) dependiendo de la respuesta.

Para esto, haremos uso de una funcionalidad de **Angular** llamada **Pipes.** Ellos nos permiten modificar la información que mostramos en el HTML de manera dinámica. Sigue estos pasos:

1. Ubica el mouse sobre la carpeta **app**, presiona click derecho y elige la opción **Pipe:**

![](/files/-LL0cy4wsr8qggqLhcxr)

2\. Asigna el nombre `emoji` en la caja de texto que aparece y **presiona enter:**

![](/files/-LL0d5jOvm_Py_l29Qvc)

Deberías ver una archivo nuevo llamada `emoji.pipe.ts` con el siguiente contenido: 👇

![](https://lh3.googleusercontent.com/mhIFxVD2y19t8GlPCySIkQCP_X48hsuUEBc2FXVnMhW_qn3rI-m1v4LgNmWmi0DbmlWL0UdQYegvENkuxSbxBu9JoQADgu7AlvB--Dn4HiFvVOU_jv1i4xevnItWa3q69wQzX0ft)

Allí verás algo que ya conoces: **Una función ✌️**

En este caso tienes la función `transform` con dos parámetros `value` y `args`

{% hint style="info" %}
La función **transform** se encarga de transformar el texto en el HTML como queramos 🎉
{% endhint %}

En el método `transform` vamos a agregar la siguiente lógica:

```typescript
if(value === "Si") {
  return value + " 😊";
}else if(value === "No") {
  return value + " 🙁";
}  
```

Lo que acabas de ver se llama una **Condición.** Básicamente estamos diciéndole a nuestra aplicación que:

* Si el valor que seleccione el usuario es **"Sí"** entonces va a concatenar un emoji **feliz** al final del texto
* Si el valor que seleccione el usuario es **"No"** entonces va a concatenar un emoji **triste** al final del texto

![](/files/-LL0dXPQDCDzZJWBfKHc)

Por último hay que utilizar nuestro `emoji` pipe para transformar la respuesta que estamos mostrando en `app.component.html` de la siguiente manera:<br>

```markup
<h1> {{ response | emoji }} </h1>
```

![](/files/-LL0foIRpuaidPx_LMSb)

Voilá! Nuestro quiz ha sido terminado! 💜

![](/files/-LL0fsWjLMGv2Bzf8Vdg)

## Lo lograste 💪

Puedes revisar la solución aquí 👇

{% embed url="<https://stackblitz.com/edit/angular-4qnmk2>" %}

{% hint style="success" %}
Has completado el **desafío #4**, ahora vamos a el **desafío #5 👇**
{% endhint %}
