Установить интервал для массива в угловом проекте

Я пытаюсь использовать функцию setInterval(), чтобы менять текст пользователю каждые 3 секунды.

Я пробовал зацикливаться с циклом for, но это не работает — я вижу «тест 03» и все.

Я не могу найти решение.

export class MessagesComponent implements OnInit {
  items = ['test 01', 'test 02', 'test 03'];
  currentItem: any;
  private interval;

  constructor() {}

  ngOnInit() {
    for (let i = 0; i < this.items.length; i++) {
      this.interval = setInterval(() => {
        this.currentItem = this.items[i];
      }, 3000);
    }
  }
}
{{ currentItem }}

Ценим любую помощь!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 211
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вместо этого попробуйте этот способ.

pointer указывает на текущий контент, который вы хотите отобразить. С каждым интервалом указатель увеличивается на 1, пока не станет > 2. Затем он снова начинается с 0.

export class MessagesComponent implements OnInit {
  items = ['test 01', 'test 02', 'test 03'];
  currentItem: any;
  private pointer: number = 0;

  constructor() {}

  ngOnInit() {
      this.interval = setInterval(() => {
        this.currentItem = this.items[this.pointer];
        this.pointer++;
        if (this.pointer > 2) { this.pointer = 0 };
      }, 3000);
  }

}

Почему этот ответ был отклонен? Пусть человек, который это сделал, изложит характер своей проблемы в моем ответе.

user6749601 31.01.2019 21:31

большое спасибо! как я могу сделать изменение более плавным? как эффект затухания или что-то в этом роде? @Рысь 242

hindi1991 31.01.2019 21:46

Пожалуйста. Для достижения эффекта затухания простая интерполяция не подойдет. Обычно это делается с помощью CSS, используя, например, 2 перекрывающихся метки. И пока один ярлык исчезает, появляется другой. Но у меня нет под рукой примера, который я мог бы вам привести. Прости.

user6749601 31.01.2019 21:55

Попробуй это:

export class MessagesComponent implements OnInit {
  items = ['test 01', 'test 02', 'test 03'];
  currentItem: any;
  private interval;

  constructor() {}

  ngOnInit() {
    for (let i = 0; i < this.items.length; i++) {
      this.interval = setInterval(() => {
        this.currentItem = this.items[i];
      }, 3000 * i);
    }
  }
}
{{ currentItem }}

Если вы довольны rxjs,

import { timer } from 'rxjs';
import { tap } from 'rxjs/operators';

ngOnInit() {
  timer(0, 3000)
    .pipe(
      tap(v => {
        this.currentItem = this.items[v%3]
      })
    )
    .subscribe(console.info);
}

меньше кода, нет цикла, нет причудливой логики :)

Вы можете сделать еще лучше с

export class MessagesComponent implements OnInit {
  private timer$ = timer(0, 3000);
  ngOnInit() {
    // for loop can be completely removed
  } 
}

а в html используйте

{{ items[(timer$ | async) % 3] }}

так что вы буквально просто используете 1 строку кода, чтобы сделать то же самое, используя асинхронный канал и rxjs, и забудьте об уродливом цикле for.

демо https://stackblitz.com/edit/angular-m5prrk?file=src%2Fapp%2Fapp.component.ts

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