Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Implementando slides

4/23
Recursos

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.

Cómo importar componentes de terceros

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.

API de Prueba

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

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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:

  1. Debes instalar el Swiper:
npm i swiper
  1. Importar el modulo en app.module:
import { SwiperModule } from 'swiper/angular'; 

Y también ponerlo en el NGModule:

imports: [ SwiperModule ]
  1. Importar los siguientes 3 estilos a los globales styles.scss:
@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.

  1. Instalar el Swiper:
npm i swiper
  1. En el archivo app.module.ts agregue CUSTOM_ELEMENTS_SCHEMA al decorador @NgModule, esto porque no reconoce swiper-container y swiper-slide, también lo agregue en el import
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 {}
  1. En el archivo products.component.ts agregué los siguientes imports
import { AfterViewInit, Component, ElementRef, ViewChild, OnInit } from '@angular/core';
.
.
.
import { register } from 'swiper/element/bundle';
import { Swiper } from 'swiper/types';

  1. Agregue en implementes AfterViewInit en la clase y agregue el decorador ViewChild.
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

  1. En el archivo products.component.html continué con el ejemplo del curso, quedando así:
<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:

  1. En el package.json colocar “swiper”: “6.8.0”, y hacer npm i

  2. Importar en el app.module> import { SwiperModule } from ‘swiper/angular’;

  3. 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:

Owl Carousel.
Slick Carousel.

No están diseñadas específicamente para Angular, pero se puede integrar utilizando directivas personalizadas.

Hola compañeros, si alguien llega a tener problemas instalando swiper, lamentablemente swiper eliminó el modulo para Angular en sus versiones mas recientes, puedes instalar la versión 8.4.6, que es la ultima que tiene el módulo, para esto: 1. Vayan a package.json en la carpeta razi de sus proyectos e identifique "swiper": "^10.X.X", cambie la versión y dejelo así: ""swiper": "^8.4.6",". 2. Luego ejecute npm i para que node refresque los paquetes y librerías. 3. Listo! siga los pasos de esta clase y debería funcionar

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]);
2024, no me sirvió ninguno de los consejos de los comentarios, tuve que seguir el curso sin Swiper no más
Las últimas versiones de swiper no soportan angular, revisar la documentación [Swiper Angular Components (swiperjs.com)](https://v8.swiperjs.com/angular), esta es la última versión que soporto angular, 8.4.6 se puede instalar con el comando **npm i [email protected]** o ***npm i [email protected]*** de forma específica.

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.

Pasos que me funcionaron 19/10/2023 `npm i swiper` En el app.module.ts, para poder utilizar swipper como componente. ```js import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { register } from 'swiper/element/bundle'; register(); @NgModule({ ... schemas: [CUSTOM_ELEMENTS_SCHEMA], }) ```Y por ultimo, lo usas en el componente que lo quieras usar: ```js <swiper-container navigation="true"> <swiper-slide *ngFor="let img of product.images"> </swiper-slide> </swiper-container> ```
Para mas información sobre la ultima versión que contiene el modulo de Angular en swiper: visiten <https://v8.swiperjs.com/angular>
En este curso recomiendo actualizar la api y el swiper ya que el swiper hoy en dia no es recomendable usar en angular ya que ya no funciona, al consumir la api de ejemplo solo sale algunas imagenes y otras sale que caducaron y sale error 404 que no esta funcionando entonces yo recomiendo que lo arreglen a la brevedad posible ya que este curso sin esos dos recursos tan necesario el curso se vuelve obsoleto

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

  1. npm install --legacy-peer-deps
  2. npm install
  3. npm audit fix
  4. npm i swiper

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>