Vamos implementar um formulário no ionic de forma reativa e salvar dados usando um banco de dados sqlite.
Altere o tab1.page.html para conter um título e as tabs para representar um formulário. Agora vamos adicionar nosso formulário de forma semelhante ao código visto na Aula 08 formulários reativos. Vamos adicionar em tab1.page.ts o seguinte código:
import { Component } from ‘@angular/core’;
import { IonicModule } from ‘@ionic/angular’;
import { ExploreContainerComponent } from ‘…/explore-container/explore-container.component’;
import { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from ‘@angular/forms’;
@Component({
selector: ‘app-tab1’,
templateUrl: ‘tab1.page.html’,
styleUrls: [‘tab1.page.scss’],
standalone: true,
imports: [IonicModule, ExploreContainerComponent, ReactiveFormsModule],
})
export class Tab1Page {
formGroup: FormGroup = this.fb.group({
nome: [‘’, Validators.required],
telefone: [‘’],
email: [‘’, Validators.email],
hobie: [‘’]
})
constructor(private fb: FormBuilder) { }
salvar() {
if (this.formGroup.valid) {
alert(‘Formulário salvo com sucesso’)
} else {
alert(‘Formulário inválido’)
}
}
}
Repare que nós usamos o import do ReactiveFormsModule diretamente no componente, fazemos isso porque o ionic 7 starter usa standalone, componentes do Angular 14.
Vamos construir nosso formulário na página tab1.page.html:
<ion-header [translucent]=“true”>
<ion-toolbar>
<ion-title>
Cadastro de pessoa
</ion-title>
</ion-toolbar>
</ion-header>
<ion-content [fullscreen]=“true”>
<ion-header collapse=“condense”>
<ion-toolbar>
<ion-title size=“large”>Cadastro de Pessoa</ion-title>
</ion-toolbar>
</ion-header>
<form [formGroup]=“formGroup” (ngSubmit)=“salvar()”>
<ion-item>
<ion-input label=“Nome” label-placement=“floating” fill=“solid”
placeholder=“Entre um nome”
errorText=“Nome é obrigatório”
formControlName=“nome”></ion-input>
</ion-item>
<ion-item>
<ion-input label=“Telefone” label-placement=“floating” fill=“solid” placeholder=“Entre um telefone” formControlName=“telefone”></ion-input>
</ion-item>
<ion-item>
<ion-input label=“Email” label-placement=“floating” fill=“solid”
errorText=“Entre com um email válido”
placeholder=“Entre um email” formControlName=“email”></ion-input>
</ion-item>
<ion-row>
<ion-col>
<ion-button type=“submit” expand=“block” [disabled]=“!formGroup.valid”>
Salvar
</ion-button>
</ion-col>
</ion-row>
</form>
</ion-content>
Nosso formulário utiliza o já conhecido formControlName e formGroup. A diferença é que agora usamos o ion-input, que nos fornece algumas propriedades interessantes:
No final colocamos um botão de tipo submit que irá ficar desabilitado se o formulário estiver inválido.
Vamos implementar um serviço para salvar os dados em um banco de dados local, com sqlite. O sqlite é um banco de dados relacional opensource que pode ser usado nativamente no dispositivo ou em aplicativos web.
Para salvar os dados no dispositivo vamos usar o plugin ionic storage juntamente com driver para SQLite. Tenha em mente que os dados são salvos no dispositivo sem criptografia, o que pode ser um problema dependendo do que a aplicação faz. Existe uma solução paga para criptografia nativa do IONIC chamada de ionic secure storage que não vamos abordar na disciplina, se estiver curioso acesse https://ionic.io/docs/secure-storage.
Instale o ionic storage e o driver para sqlite (vai ser usado quando em um dispositivo nativo):
npm install @ionic/storage-angular
npm install cordova-sqlite-storage
npm install localforage-cordovasqlitedriver
Após isso, crie e configure o plugin no arquivo main.ts.
import { enableProdMode, importProvidersFrom } from ‘@angular/core’;
import { bootstrapApplication } from ‘@angular/platform-browser’;
import { RouteReuseStrategy, provideRouter } from ‘@angular/router’;
import { IonicModule, IonicRouteStrategy } from ‘@ionic/angular’;
import { routes } from ‘./app/app.routes’;
import { AppComponent } from ‘./app/app.component’;
import { environment } from ‘./environments/environment’;
import { IonicStorageModule } from ‘@ionic/storage-angular’;
import CordovaSQLiteDriver from ‘localforage-cordovasqlitedriver’
import { Drivers } from ‘@ionic/storage’;
if (environment.production) {
enableProdMode();
}
bootstrapApplication(AppComponent, {
providers: [
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
importProvidersFrom(IonicModule.forRoot({}), IonicStorageModule.forRoot({
name: ‘mydb’,
driverOrder: [CordovaSQLiteDriver._driver, Drivers.IndexedDB, Drivers.LocalStorage]
})),
provideRouter(routes),
],
});
Aqui dizemos para o plugin usar o SQL driver ou os outros drivers (IndexDB, LocalStorage), se disponíveis. Isso faz com que o sistema funcione na web para testarmos, e quando gerarmos um aplicativo nativo ou usarmos um emulador ele vai escolher o sqlite.