Карусель в Angular Issue

Я пытаюсь создать простую карусель в Angular, но часть взаимодействия не работает, я не понял проблему, может кто-нибудь мне помочь, пожалуйста? При нажатии на кнопки не меняются разные картинки..

Пробовал использовать Я ожидаю, что часть взаимодействия заработает...

Это код: слайдшоу.компонент.html:

<body>
    <div id = "carousel-container">
        <div *ngIf = "  images && images.length > 0" class = "carousel-container">
          <div *ngFor = "let image of images; let i = index">
            <img [src] = "image.imagesrc" [alt] = "image.imagealt"
                 [ngClass] = "{'image-active': selectedIndex === i}"
                 (click) = "selectImage(i)" class = "fade">
         
        </div>
          <div *ngIf = "indicators" class = "carousel-dot-container">
            <span class = "dot" *ngFor = "let dot of images; let i = index"
                  [ngClass] = "{'dot-active': selectedIndex === i}"
                  (click) = "selectImage(i)">
            </span>
          </div>
          <a class = "prev" (click) = "previousSlide()">&#10094;</a>
          <a class = "next" (click) = "nextSlide()">&#10095;</a>
          
        </div>
    
      </div>

</body>
</html>  ,


слайдшоу.компонент.ц

import { Component, Input, OnInit } from '@angular/core';

import {  CommonModule } from '@angular/common'; 

interface SlideContent{
   imagesrc: string;
   imagealt: string;
   
}



@Component({
  selector: 'app-slideshow',
  standalone: true,
  imports: [CommonModule],
  templateUrl: './slideshow.component.html',
  styleUrl: './slideshow.component.css'
})
export class SlideshowComponent implements OnInit {
  @Input() images: SlideContent[] = [];
  @Input() indicators = true;

  selectedIndex = 0;
   intervalId:any;

ngOnInit(): void {
  console.info('Slideshow initialized with images:', this.images);
}

//sets index of image on dot/indicator click
selectImage(index: number): void{

this.selectedIndex= index;
}


startAutoSlide() {
  this.intervalId = setInterval(() => {
    this.nextSlide();
  }, 3000); // Change slide every 3 seconds
}

nextSlide() {
  this.selectedIndex = (this.selectedIndex + 1) % this.images.length;
}

previousSlide() {
  this.selectedIndex = (this.selectedIndex - 1 + this.images.length) % this.images.length;
}
}

App.comComponent.ts

images =[
 {
    imagesrc:'example',
     imagealt:"example",
 },
 {
  imagesrc: 'example',
   imagealt:"example",
},
{
  imagesrc:'example',
   imagealt:"example",
},

 }

И затем в App.comComponent.html: <app-slideshow [images] = "images" [indicators] = "true"></app-slideshow>

Ошибка: NG0500: во время гидратации ожидался Angular, но был найден мета.

избавьтесь от тегов body и HTML, они никогда не принадлежат компонентам, это вызывает ошибку гидратации

Naren Murali 17.06.2024 14:01

Значит, каждому HTML-коду каждого компонента не нужна структура?

NOne 17.06.2024 14:09

Теги html,`body`` принадлежат index.html, их можно объявить только один раз! Поскольку ваше угловое приложение создается внутри тега body index.html.

Naren Murali 17.06.2024 14:11

ок, круто, все еще получаю ошибку. Я удалил все теги html/body из компонентов и оставил их в index.html.

NOne 17.06.2024 14:14

затем закомментируйте компоненты один за другим и определите проблему, но ответ ниже является решением вашего первоначального вопроса!

Naren Murali 17.06.2024 14:16
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
5
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов метода autoslide на крючке ngOnInit отсутствовал.

Я добавил еще один входной параметр для автозапуска, чтобы включить его!

Поскольку у вас включен SSR, вы можете использовать isPlatformBrowser, чтобы гарантировать, что код запускается только в браузере, поскольку на сервере нет document, window или setInterval.

  ngAfterViewInit(): void {
    console.info('Slideshow initialized with images:', this.images);
    if (this.isBrowser) {
      if (this.autoplay) {
        this.startAutoSlide();
      }
    }
  }

Полный код:

import { CommonModule, isPlatformBrowser } from '@angular/common';
import { Component, Inject, Input, PLATFORM_ID } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';

interface SlideContent {
  imagesrc: string;
  imagealt: string;
}

@Component({
  selector: 'app-slideshow',
  standalone: true,
  imports: [CommonModule],
  styles: [
    `
  .fade {
    display: none;
  }
  .image-active {
    display: block;
  }
  `,
  ],
  template: `
  @defer {
    <div id = "carousel-container">
        <div *ngIf = "  images && images.length > 0" class = "carousel-container">
          <div *ngFor = "let image of images; let i = index">
            <img [src] = "image.imagesrc" [alt] = "image.imagealt"
                 [ngClass] = "{'image-active': selectedIndex === i}"
                 (click) = "selectImage(i)" class = "fade">
         
        </div>
          <div *ngIf = "indicators" class = "carousel-dot-container">
            <span class = "dot" *ngFor = "let dot of images; let i = index"
                  [ngClass] = "{'dot-active': selectedIndex === i}"
                  (click) = "selectImage(i)">
            </span>
          </div>
          <a class = "prev" (click) = "previousSlide()">&#10094;</a>
          <a class = "next" (click) = "nextSlide()">&#10095;</a>
          
        </div>
    
      </div>
  }
  `,
})
export class SlideShow {
  @Input() images: SlideContent[] = [];
  @Input() indicators = true;
  @Input() autoplay = true;

  selectedIndex = 0;
  intervalId: any;
  isBrowser = false;

  constructor(@Inject(PLATFORM_ID) private _platformId: Object) {
    this.isBrowser = isPlatformBrowser(this._platformId);
  }

  ngAfterViewInit(): void {
    console.info('Slideshow initialized with images:', this.images);
    if (this.isBrowser) {
      if (this.autoplay) {
        this.startAutoSlide();
      }
    }
  }

  //sets index of image on dot/indicator click
  selectImage(index: number): void {
    this.selectedIndex = index;
  }

  startAutoSlide() {
    this.intervalId = setInterval(() => {
      this.nextSlide();
    }, 3000); // Change slide every 3 seconds
  }

  nextSlide() {
    this.selectedIndex = (this.selectedIndex + 1) % this.images.length;
  }

  previousSlide() {
    this.selectedIndex =
      (this.selectedIndex - 1 + this.images.length) % this.images.length;
  }
}

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [SlideShow],
  template: `
    <app-slideshow [images] = "images" [indicators] = "true"></app-slideshow>
  `,
})
export class App {
  images = [
    {
      imagesrc: 'https://placehold.co/600x400/000000/FFFFFF/png?text=Slide+1',
      imagealt: 'example',
    },
    {
      imagesrc: 'https://placehold.co/600x400/000000/FFFFFF/png?text=Slide+2',
      imagealt: 'example',
    },
    {
      imagesrc: 'https://placehold.co/600x400/000000/FFFFFF/png?text=Slide+3',
      imagealt: 'example',
    },
  ];
}

bootstrapApplication(App);

Демо-версия Stackblitz

Я получаю сообщение об ошибке таймаута..кстати, спасибо за ответ

NOne 17.06.2024 13:03

@NOne снова обновил мой ответ! попробуй сейчас!

Naren Murali 17.06.2024 13:34

У меня возникла небольшая проблема... когда я вношу изменения, сборка проекта продолжается бесконечное время, и каждый раз мне нужно перезапустить cmd.

NOne 17.06.2024 15:11

@NOne, пожалуйста, попробуйте мой код с isBrowser

Naren Murali 17.06.2024 15:13

Итак, когда я удаляю импорт Zone.js, он работает, но setInterval нет. Что я могу сделать?

NOne 18.06.2024 04:13

@NOne, пожалуйста, создайте новый вопрос и поделитесь репозиторием GitHub.

Naren Murali 18.06.2024 05:02

Другие вопросы по теме