Desarrollar una aplicación híbrida utilizando tecnologías que integren modelos de aprendizaje automático previamente entrenados en un entorno funcional y accesible para resolver problemas específicos mediante el reconocimiento de patrones, objetos o sonidos fomentando habilidades prácticas en el desarrollo de aplicaciones móviles con tecnologías modernas y la implementación de inteligencia artificial.
Edite el archivo src/app/tabs/tabs.page.ts, con:
Edite el archivo src/app/tabs/tabs.page.html, con:
(STOP 1) Compruebe el resultado en el navegador.
Edite el archivo src/app/tab1/tab1.page.ts, con:
...
import {
/* Importe los componentes de la UI */
IonFab, IonFabButton, IonIcon, IonCard,
...
} from '@ionic/angular/standalone';
/* Importe la función y el ícono */
import { addIcons } from 'ionicons';
import { cloudUploadOutline } from 'ionicons/icons';
@Component({
...
imports: [
/* Registre los componentes de la UI */
IonFab, IonFabButton, IonIcon, IonCard,
...
]
})
export class Tab1Page {
constructor() {
/* Registre el ícono */
addIcons({ cloudUploadOutline });
}
}
Reemplace todo el contenido en el archivo src/app/tab1/tab1.page.html, por:
<ion-header [translucent]="true">
<ion-toolbar>
<ion-title>
Teachable Machine
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
<ion-header collapse="condense">
<ion-toolbar>
<ion-title size="large">Teachable Machine</ion-title>
</ion-toolbar>
</ion-header>
<!-- CARGA DE IMAGEN - INICIO -->
<!-- CARGA DE IMAGEN - FIN -->
<input type="file" accept="image/*" />
<ion-fab slot="fixed" vertical="bottom" horizontal="center">
<ion-fab-button>
<ion-icon name="cloud-upload-outline"></ion-icon>
</ion-fab-button>
</ion-fab>
</ion-content>
Edite el archivo src/app/tab1/tab1.page.scss, con:
img {
width: 100vw;
height: 30vh;
object-fit: cover;
}
ion-button {
margin: 0 auto;
}
(STOP 2) Compruebe el resultado en el navegador.
Edite el archivo src/app/tab1/tab1.page.ts, con:
...
export class Tab1Page {
...
/* El método onSubmit para enviar los datos del formulario mediante el servicio */
onFileSelected(event: Event): void {
const input = event.target as HTMLInputElement;
if (input.files && input.files.length > 0) {
const file = input.files[0];
console.log(file)
}
}
}
Edite el archivo src/app/tab1/tab1.page.html, con:
...
<!-- Referencia en plantilla #fileInput, callback para el evento change y oculte el elemento -->
<input #fileInput type="file" accept="image/*" (change)="onFileSelected($event)" hidden />
<!-- Disparo del evento click de fileInput -->
<ion-fab slot="fixed" vertical="bottom" horizontal="center">
<ion-fab-button (click)="fileInput.click()">
<ion-icon name="cloud-upload-outline"></ion-icon>
</ion-fab-button>
</ion-fab>
...
(STOP 3) Compruebe el resultado en el navegador.
Edite el archivo src/app/tab1/tab1.page.ts, con:
...
export class Tab1Page {
...
/* El método onSubmit para enviar los datos del formulario mediante el servicio */
onFileSelected(event: Event): void {
const input = event.target as HTMLInputElement;
if (input.files && input.files.length > 0) {
const file = input.files[0];
const reader = new FileReader();
// Convertir el archivo a una URL base64 para mostrarlo en el html
reader.onload = () => {
console.log(reader.result as string)
};
reader.readAsDataURL(file); // Leer el archivo como base64
}
}
}
(STOP 4) Compruebe el resultado en el navegador.
Edite el archivo src/app/tab1/tab1.page.ts, con:
/* Importe la función signal */
import { Component, signal } from '@angular/core';
...
export class Tab1Page {
imageReady = signal(false)
imageUrl = signal("")
...
/* El método onSubmit para enviar los datos del formulario mediante el servicio */
onFileSelected(event: Event): void {
...
if ( ... ) {
...
// Convertir el archivo a una URL base64 para mostrarlo en el html
reader.onload = () => {
this.imageUrl.set(reader.result as string)
this.imageReady.set(true)
};
...
}
}
}
Edite el archivo src/app/tab1/tab1.page.html, con:
...
<ion-content [fullscreen]="true">
<!-- CARGA DE IMAGEN - INICIO -->
@if(imageReady()) {
<ion-card>
<img [src]="imageUrl()" alt="Imagen seleccionada" />
<!-- CARGA DE PREDICCIÓN - INICIO -->
<!-- CARGA DE PREDICCIÓN - FIN -->
</ion-card>
}
<!-- CARGA DE IMAGEN - FIN -->
</ion-content>
...
(STOP 5) Compruebe el resultado en el navegador.
Signals in Angular: deep dive for busy developers #angular #javascript #frontend #webdev #dormosheio #frontenddev https://t.co/wTz8qybA3W
— AngularTrends (@AngularTrends) August 15, 2024
signals