Почему уже созданные элементы наследуют стиль нового элемента на ngFor в Angular?

Я пытаюсь добавить новые теги, но хочу, чтобы они изменили свой фоновый цвет ... как я могу это сделать?

 <input type = "text" class = "form-control" [(ngModel)] = "select">
 <button type = "button" (click) = "addItem(select)" 
                       (click) = "setColor()">Enviar</button>
 <div *ngFor = "let i of items">
   <div class = "badge badge-pill" [ngStyle] = "{'background-color' : 
                                                               randomcolor}">{{ i }}
   </div>
 </div>

select: string
items = []
randomcolor: any

addItem(item){
  this.items.push(item)
  console.info(this.getRandomColor())
}


getRandomColor(){
  var letters = '0123456789ABCDEF'.split('');
  var color = '#';
  for (var i = 0; i < 6; i++){
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}


setColor(){
  this.randomcolor = this.getRandomColor()
}

Они остаются с теми же цветами фона.

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

HTML:

<input type = "text" class = "form-control" [(ngModel)] = "select">
<button type = "button" (click) = "addItem(select)">Enviar</button>
<div *ngFor = "let i of items">
  <div class = "badge badge-pill" [style.background] = "color[i]">
    {{ i }}
  </div>
</div>

TS:

select: string
items = []
color: any = {};

addItem(item) {
  this.items.push(item);
  this.color[item] = this.randomColor;
}

get randomColor() { return '#' + ('' + Math.random().toString(16).split('.')[1]).slice(-6); }

Angular будет запускать ваш метод при каждом цикле обнаружения изменений, поэтому цвета всегда будут меняться, не так ли? Также почему вы возвращаете функцию жирной стрелки вместо самого значения?

Bunyamin Coskuner 13.03.2018 14:40

Отметьте этот stackblitz, stackblitz.com/edit/angular-iphnjb?file=app/app.component.ht‌ мл Когда вы нажимаете кнопку, цвет меняется, также angular выдает "ExpressionChangedAfterItHasBeenCheckedError" на консоли.

Bunyamin Coskuner 13.03.2018 14:42

Спасибо за внимание, я отредактировал свой ответ (не тестировал, только написал от руки)

user4676340 13.03.2018 14:43

Спасибо за редактирование. Однако это все еще не совсем работает. Не думаю, что это хорошее решение.

Bunyamin Coskuner 13.03.2018 14:44

Пока не работает, все равно меняют цвета и выдают ошибку в консоли. Но я решил здесь! Спасибо за вашу помощь!

Vitor Marcolino 13.03.2018 14:45

@VitorMarcolino, ваша проблема заключалась в одном атрибуте randomcolor, не так ли? Мой ответ тебе помог?

Bunyamin Coskuner 13.03.2018 14:46

@BunyaminCoskuner Я наконец нашел время, чтобы проверить его, и еще раз отредактировал свой ответ. Спасибо за внимание (еще раз). Витор, рад за тебя! Не забудьте отметить проблему как решенную!

user4676340 13.03.2018 14:49

@BunyaminCoskuner да! Спасибо за вашу помощь. Решено!

Vitor Marcolino 13.03.2018 15:02

Спасибо, @trichetriche .. Я ценю вашу помощь!

Vitor Marcolino 13.03.2018 15:02
Ответ принят как подходящий

Проблема в том, что у вас есть один атрибут randomcolor, который используется всеми вашими товарами. Поэтому цвет фона может измениться, но все они будут иметь одинаковый цвет фона.

Попробуй это

select: string
items = []

addItem(item){
  const color = this.getRandomColor();
  this.items.push({value: item, bgColor: color});
}


getRandomColor(){
  var letters = '0123456789ABCDEF'.split('');
  var color = '#';
  for (var i = 0; i < 6; i++){
    color += letters[Math.floor(Math.random() * 16)];
  }
  return color;
}

В HTML

<input type = "text" class = "form-control" [(ngModel)] = "select">
 <button type = "button" (click) = "addItem(select)">Enviar</button>
 <div *ngFor = "let item of items">
   <div class = "badge badge-pill" [ngStyle] = "{'background-color' : item.bgColor}">{{ item.value }}
   </div>
 </div>

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