Con base en la documentación con el nuevo parh sería así:
@import ‘~swiper/css’;
Http Basic
Lo que aprenderás para consumir API con Angular
Solicitudes GET
Detalle de producto
Implementando slides
Solicitudes POST
Solicitudes PUT y PATCH
Solicitudes DELETE
Url Parameters / Paginación
Observable vs. Promesa
Reintentar una petición
Buenas prácticas
El problema de CORS
Manejo de ambientes
Manejo de errores
Transformar peticiones
Evitando el callback hell
Auth
Login y manejo de Auth
Manejo de headers
Uso de interceptores
Enviar Token con un interceptor
Creando un contexto a interceptor
Archivos
Descarga de archivos con Http
Subida de archivos con Http
Despedida
Continúa con el Curso de Angular Router y Programación Modular
Crea una cuenta o inicia sesión
¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera
Nicolas Molina
Una necesidad crucial cuando se trabaja con Angular es la importación de componentes de terceros para un rápido desarrollo y utilización de los mismos.
Anímate a crear un carrusel de imágenes utilizando librerías como SwiperJS. Luego, instala la dependencia con el comando npm i swiper
e impórtala en el módulo principal de tu aplicación para que esté lista para utilizarse.
import { SwiperModule } from 'swiper/angular';
@NgModule({
imports: [SwiperModule],
})
export class AppModule {}
Es importante que sepas importar y utilizar este tipo de componentes ya listos para ser utilizados y agilizar así el desarrollo de cualquier aplicación.
Existen muchas API gratuitas que puedes utilizar para practicar y construir aplicaciones, te comparto las más populares para que las investigues
Anímate a explorar estas API y diviértete desarrollando aplicaciones y practicando todo lo que ya sabes sobre Angular hasta aquí. Más adelante en el curso verás cómo potenciar el consumo de API con Angular y sacarle mayor provecho a este framework.
Contribución creada por: Kevin Fiorentino.
Aportes 43
Preguntas 13
Con base en la documentación con el nuevo parh sería así:
@import ‘~swiper/css’;
Al día de hoy creo que a cambiado un poco.
No me dio error en la instalación de la siguiente manera:
npm i swiper
import { SwiperModule } from 'swiper/angular';
Y también ponerlo en el NGModule:
imports: [ SwiperModule ]
@import 'swiper/scss';
@import 'swiper/scss/navigation';
@import 'swiper/scss/pagination';
Espero te ayude, por ahora no me dio error, no sé si mas adelante lo haga jaja.
No olvides mirar la documentación oficial:
https://swiperjs.com/angular
Nunca pares de aprender ❤️
Actualizacion para Swiper a la version reciente
Primero instalamos swiper:
npm install swiper
Les va a instalar la mas nueva. ^9.3.2
Despues agregamos esto a app.module.ts:
import {CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import { register } from 'swiper/element/bundle';
register();
schemas: [CUSTOM_ELEMENTS_SCHEMA]
asi:
Y ya con eso estaria funcionando.
No es necesario que se agreguen estilos por el momento como se ve en el video.
Para renderizarlo en el componente .html se debe escribir asi:
Las clases que agregue no tienen nada que ver. Son simplemente estilos propios. Lo importante son las etiquetas:
<swiper-container> y <swiper-slide>
Son la nueva forma de escribirlas.
Les dejo la documentacion: https://swiperjs.com/element
Espero les sirva
Es necesario actualizar este video, swiper cambio muchisimo en su ultima versión
hola, miren para que puedan los nuevos que vana entrar a este curso, ya que el curso tiene bastante tiempo y al seguir los pasos del profe a algunos les va a dar un error hagan esto:
en su terminal van a escribir para instalar
npm i swiper@8.4.7
y despues van a ir a la documentacion: https://v8.swiperjs.com/angular
y en su sccss van a pegar esto:
/* You can add global styles to this file, and also import other style files */
@import url('https://fonts.googleapis.com/css2?family=Quicksand&display=swap');
@import url(./styles/reset.scss);
@import 'swiper/scss';
@import 'swiper/scss/navigation';
@import 'swiper/scss/pagination';
* {
font-family: 'Quicksand', sans-serif;
}
.products--grid {
app-img {
img {
border-radius: 10px;
max-height: 200px;
}
}
}
Considero que una buena práctica sería separar el detall del contenido en un nuevo componente product-detail
<h1>{{ product.title }}</h1>
<p>{{ product.description }}</p>
<swiper
[slidesPerView]="1"
>
<ng-template swiperSlide *ngFor="let img of product.images">
<img [src]="img" [alt]="product.title">
</ng-template>
</swiper>
<p>{{ product.description }}</p>
Para que te funcione correctamente el Swipper
debes hacer lo siguiente:
En la consola ejecutar lo siguiente para instalar Swipper
npm i swiper
De ahi en el app.module.ts lo deben poner asi.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { SwiperModule } from 'swiper/angular';
import SwiperCore, { Pagination } from "swiper";
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ImgComponent } from './components/img/img.component';
import { ProductComponent } from './components/product/product.component';
import { ProductsComponent } from './components/products/products.component';
import { NavComponent } from './components/nav/nav.component';
import { ReversePipe } from './pipes/reverse.pipe';
import { TimeAgoPipe } from './pipes/time-ago.pipe';
import { HighlightDirective } from './directives/highlight.directive';
SwiperCore.use([Pagination]);
@NgModule({
declarations: [
AppComponent,
ImgComponent,
ProductComponent,
ProductsComponent,
NavComponent,
ReversePipe,
TimeAgoPipe,
HighlightDirective
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule,
FormsModule,
SwiperModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
y en los estilos globales agregar esto
@import '~swiper/scss';
y listo ya estaria y funcionaria correctamente
En este capítulo me dio problemas al querer implementar Swiper Element revisando la documentación, hicieron una actualización y ahora se implementa de otra forma. Les comparto como lo implemente por si alguien más se atora en este paso.
npm i swiper
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
En el decorador sería de la siguiente manera:
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, AppRoutingModule],
providers: [],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule {}
import { AfterViewInit, Component, ElementRef, ViewChild, OnInit } from '@angular/core';
.
.
.
import { register } from 'swiper/element/bundle';
import { Swiper } from 'swiper/types';
export class ProductsComponent implements OnInit, AfterViewInit {
.
.
.
@ViewChild('swiper')
swiperRef: ElementRef | undefined;
swiper?: Swiper;
ngAfterViewInit(): void {
register();
this.swiper = this.swiperRef?.nativeElement.swiper;
}
Nota: El ngAfterViewInit lo agregué para poder hacer el register() ya que en la documentación dice que se tiene que llamar antes de utilizarlo
<div class="product-detail" [class.active]="showProductDetail">
<div *ngIf="productChosen">
<button (click)="toggleProductDetail()">Colse</button>
<h1>{{ productChosen.title }}</h1>
<swiper-container #swiper initial-slide="0" pagination="true" slides-per-view="1">
<swiper-slide *ngFor="let img of productChosen.images">
<img [src]="img" width="100%" alt="{{ productChosen.title }}" />
</swiper-slide>
</swiper-container>
<p>{{ productChosen.description }}</p>
</div>
</div>
Saludos.
Le agregué algunos estilos a la App para qué quedará mejor
Le puse la siguiente lógica al código de onShowDetails
onShowDetails(id:string){
//en caso de que den dos veces al botón solo ocultara los detalles(para no ir a darle al botón de cerrar)
if(this.productChosen.id != '' && this.productChosen.id == id && this.showProductDetail==true){
this.showProductDetail = false;
return;
}
//en caso de que seleccionen el mismo producto ya no hay necesidad de hacer la petición de nuevo y solo vuelve a mostrar el panel
if(this.productChosen.id != '' && this.productChosen.id == id && this.showProductDetail==false){
this.showProductDetail = true;
return;
}
//en caso que le den al botón de ver detalles mientras ya están abiertos los de un producto diferente cierra el panel de detalles
if(this.productChosen.id != '' && this.productChosen.id != id && this.showProductDetail==true){
this.showProductDetail = false;
}
this.productService.getProduct(id)
.subscribe(data => {
this.productChosen = data;
if(!this.showProductDetail){
this.toggleProductDetail();
}
});
}
Codigo de ejemplo de Swiper:
<swiper
[slidesPerView]=“3”
[spaceBetween]=“50”
(swiper)=“onSwiper($event)”
(slideChange)=“onSlideChange()”
>
<ng-template swiperSlide>Slide 1</ng-template>
<ng-template swiperSlide>Slide 2</ng-template>
<ng-template swiperSlide>Slide 3</ng-template>
</swiper>
swiper me jodiste
creo que deberian cambiar el curso nada mas por implementar swiper. Esta herramienta cambio mucho y los estudiantes estan teniendo muchos porblemas para seguir el hilo por los cambios en la implementacion 😦
Se me presentó un problema/error ( Error: Module build failed) al momento de importar los estilos ya que estoy usando css.
Buscando pude resolverlo importándolos así:
@import '~swiper/swiper.min.css';
@import '~swiper/modules/navigation/navigation.min.css';
@import '~swiper/modules/pagination/pagination.min.css';
bootstrap tambien maneja slices bueno un poco mas facil de implementar
Esto lo voy a usar para mi proyecto del trabajo 8)
Swiper
Por si tienen problemas con el swiper:
En el package.json colocar “swiper”: “6.8.0”, y hacer npm i
Importar en el app.module> import { SwiperModule } from ‘swiper/angular’;
en el Styles.scss colocar > @import ‘~swiper/swiper.scss’;
Y no se preocupen si ven que la misma url de la imagen no muestra la misma, cambia por segundo.
Les comparto dos alternativas para Swiper:
No están diseñadas específicamente para Angular, pero se puede integrar utilizando directivas personalizadas.
La versión actual ya no tiene soporte para Angular, por lo que se debe instalar con:
npm i [email protected]
La documentación se puede obtener con el enlace:
(https://v8.swiperjs.com/angular)
#Arreglando Swipper
Si como yo estás haciendo este curso en 2023, el swiper no te funcionará ya que con
npm i swiper
se te instalará la version 10 cuando solo dan soporte para angular hasta la 8:
npm install swiper@8.4.6
Esta es su documentación correspondiente:
https://v8.swiperjs.com/angular
Implementando Slider, pero con Boostrap 5.0
# Primero Instalamos la Librería en el Directorio del Proyecto
ng add @ng-bootstrap/ng-bootstrap
# Importamos la Librería
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
Finalemte la implementamos al proyecto
<div *ngIf="productChosen" class="product-detail" [class.active]="showProductDetail">
<div id="carouselExampleIndicators" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-indicators">
<button type="button" *ngFor="let img of productChosen.images; index as i" class="carousel-item" [class.active]="i === indexImgActivate"
data-bs-target="#carouselExampleIndicators" data-bs-slide-to="0" class="active" aria-current="true" aria-label="Slide 1"></button>
</div>
<div class="carousel-inner">
<div *ngFor="let img of productChosen.images; index as i" class="carousel-item" [class.active]="i === indexImgActivate" >
<img [src]="img" class="d-block w-100" alt="...">
</div>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="prev" (click)="onPrevImage()">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselExampleIndicators" data-bs-slide="next" (click)="onNextImage()">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>
<h1>{{ productChosen.title }}</h1>
<p>{{ productChosen.description }}</p>
<button (click)="onToogleProductDetail()">Close</button>
</div>
Hay que crear, una variable y dos funciones adicionales
indexImgActivate = 0;
onPrevImage() {
if (this.indexImgActivate > 0) {
this.indexImgActivate -= 1;
} else {
this.indexImgActivate = this.productChosen.images.length-1;
}
}
onNextImage() {
if (this.indexImgActivate<this.productChosen.images.length-1) {
this.indexImgActivate += 1;
} else {
this.indexImgActivate = 0;
}
}
Swiper esta totalmente cambiado tratando de ser pago imposible de implementar actualmente, mas en un curso
Para seguir el vídeo, toca instalar swiperv8. https://v8.swiperjs.com/angular
npm i swiper@8
Para importar los estilos: @import '~swiper/scss';
Me costo un poco. Y ojala aqui haya alguien que sepa mucho Angula para orientarme mas.
Lo que hice fue separar el componente de product-detail en su correspondiente componente, mediante la comunicacion de componentes le pase el “productChoosen” para que pudiera cargar la data.
Mi dolor de cabeza comenzo fue cuando comence a manejar lo que yo llamaria el estado de “showProductDetail” y dure casi 4 horas leyendo e investigando a lo que plantee la siguiente solucion.
En el store service cree un Observable que me permitiera escuchar el estado de manera constante:
StorageService
//storage.service.ts
private showProductDetail = false;
private showProduct = new BehaviorSubject<boolean>(this.showProductDetail);
showProduct$ = this.showProduct.asObservable();
toogleProduct(){
this.showProductDetail = !this.showProductDetail;
this.showProduct.next(this.showProductDetail)
}
Luego en el componente de product detail lo que hice fue almacenar el estado y modificarlo manejando el servicio.
Componente product-datail
//product-detail.component.ts
constructor(private storeService: StoreService) { }
showProductDetail = false
showProduct$ = this.storeService.showProduct$
ngOnInit(){
this.storeService.showProduct$.subscribe(state => {
this.showProductDetail = state
})
}
toggleProductDetail() {
this.storeService.toogleProduct()
}
Me quedo un sin sabor de boca por todo el tiempo que me demore en esto, y segundo porque siento que debe existir una manera mas sencilla y mucho mejor de hacer exactamente lo mismo.
Con un poco de desanimo les comparto mi aporte.
Me descargué los archivos de la clase, y me sigue sin funcinoar el swiper
Espero que alguien le sirva de ayuda
Para que me funcione swiper lo importe en el archivo de estilos del componente y del style general.
Además, importe las siguientes líneas en el archivo products.component.scss
@import ‘swiper/css’;
@import ‘swiper/css/bundle’;
@import ‘swiper/css/a11y’;
@import ‘swiper/css/navigation’;
@import ‘swiper/css/pagination’;
y en el archivo styles.scss importe lo siguiente
@import ‘swiper/css’;
@import ‘swiper/css/bundle’;
Para que les funcione el paginador de slides, deben agregar las siguientes lineas en el app.module.ts.
import { SwiperModule } from 'swiper/angular';
import SwiperCore, { Pagination } from "swiper";
SwiperCore.use([Pagination]);
Actualmente implementar swiper.js en angular es todo un reto no encontré información o video de como lograrlo, pero considero al ser un slider de imágenes sencillo sería mucho mejor hacerlo de manera nativa con angular, html y css, aunque claro sería también un reto el desarrollo y mantenimiento del mismo.
Asi implemente el swiper y me funciona.
npm i swiper (instalar version mas reciente)
En el archivo styles.scss
@import ‘swiper/css/bundle’;
En el .ts a utilizar swiper
import Swiper from ‘swiper’;
npm install [email protected]
Por si no les servia la nueva version de swiper
Ya parece que no funciona swiper para angular (pequeño detalle)
Utilicen este comando y pueden seguir el video, npm i [email protected] --save
Si están usando Angular 15 y Swiper 8:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { SwiperModule } from 'swiper/angular';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { ImgComponent } from './components/img/img.component';
import { ProductComponent } from './components/product/product.component';
import { ProductsComponent } from './components/products/products.component';
import { NavComponent } from './components/nav/nav.component';
import { ReversePipe } from './pipes/reverse.pipe';
import { TimeAgoPipe } from './pipes/time-ago.pipe';
import { HighlightDirective } from './directives/highlight.directive';
@NgModule({
declarations: [
AppComponent,
ImgComponent,
ProductComponent,
ProductsComponent,
NavComponent,
ReversePipe,
TimeAgoPipe,
HighlightDirective
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule,
FormsModule,
SwiperModule,
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
y para los estilos: @import 'swiper/scss';
Para usar los modules de navegacion de swipper en Angular deben importar lo siguiente:
import SwiperCore, { Navigation, Pagination, Scrollbar } from 'swiper';
// install Swiper modules
SwiperCore.use([Navigation, Pagination, Scrollbar])
Si alguien tuvo problemas al instalar o aparece un error:
npm ERR! code ERESOLVE
npm ERR! ERESOLVE could not resolve
yo utilice estos comandos
Si utilizan css, importar en el styles.css lo siguiente
@import ‘~swiper/swiper.min.css’;
@import ‘~swiper/modules/navigation/navigation.min.css’;
@import ‘~swiper/modules/pagination/pagination.min.css’;
Utilizando nuestro componente de imagenes
<h1>{{productChosen.title}}</h1>
<swiper [slidesPerView]="1">
<ng-template swiperSlide *ngFor="let imag of productChosen.images">
<app-img [img]="imag"></app-img>
</ng-template>
</swiper>
<p>{{productChosen.description}}</p>
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?