NgClass вызывает метод несколько раз

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

компонент.html

<div class = "circle" [ngClass] = "setMyClassesCircle(1)">
<div class = "circle" [ngClass] = "setMyClassesCircle(2)">
<div class = "circle" [ngClass] = "setMyClassesCircle(3)">
<div class = "circle" [ngClass] = "setMyClassesCircle(4)">

компонент.ts

 setMyClassesCircle(val)
 {
   let circleClasses
   console.info('Inside method')

   switch(val)
   {

     case 1:
     {

    circleClasses = {
   'inprogress-circle': this.inProgress == val,
   'completed-circle': this.oneCompleted == true

   } 
     break;
   }
   case 2:
   {
    circleClasses = {
   'inprogress-circle': this.inProgress == val,
   'completed-circle': this.twoCompleted == true
   } 
     break;
   }
   case 3:
   {
    circleClasses = {
   'inprogress-circle': this.inProgress == val,
   'completed-circle': this.threeCompleted == true
   } 
     break;
   }
   case 4:
   {
    circleClasses = {
   'inprogress-circle': this.inProgress == val,
   'completed-circle': this.fourCompleted == true
   } 
     break;
   }

Таким образом я привязываю круговые классы к моему шаблону.

Но проблема, с которой я столкнулся, заключается в том, что метод setMyClassesCircle() вызывается более 10 раз, в то время как я вызываю метод только четыре раза. «Метод внутри» печатается более 10 раз в моей консоли.

Я не мог понять, почему метод вызывается так много раз.

Это ожидаемо. Вы используете метод в шаблоне, и этот метод будет вызываться для каждого обнаруженного изменения.

John 28.05.2019 08:18

демонстрационный код на stackblitz.com был бы более полезным, согласно вашим сомнениям в разделе комментариев ответа Эхсана Киани.

Shashank Vivek 28.05.2019 08:50
Тестирование функциональных 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
2
2
2 886
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Angular запускает жизненный цикл changedetection несколько раз, чтобы определить, изменился ли результат вашей функции. Он будет запускать его каждый раз, когда вы нажимаете что-то или происходят подобные события, чтобы определить, изменились ли вещи снова. По этой причине не рекомендуется привязывать значения к функциям, вместо этого вы должны вычислить значения в вашем .ts-файле и просто выполнить привязку к предварительно рассчитанным значениям.

Мне нужно, чтобы значения моих свойств были изменены на основе условия в моем ngOnInit. Но мое представление не обновляется до последнего значения. Я тоже пробовал ngAfterViewInit

Sathya Narayanan GVK 28.05.2019 08:22

Как я могу предварительно рассчитать значения до того, как они достигнут шаблона. Например: я объявил myVar = 5 и хочу изменить на основе условия до того, как он достигнет шаблона. Спасибо за помощь

Sathya Narayanan GVK 28.05.2019 08:24
Ответ принят как подходящий

Я думаю, что он вызывался много раз из-за обнаружения угловых изменений, более чистое решение — использовать встроенный ngclass следующим образом:

    <div class = "circle" [ngClass] = "{
        'inprogress-circle': inProgress == 1,
       'completed-circle': oneCompleted == true }" >

 <div class = "circle" [ngClass] = "{
        'inprogress-circle': inProgress == 2,
       'completed-circle': oneCompleted == true }" >

 <div class = "circle" [ngClass] = "{
        'inprogress-circle': inProgress == 3,
       'completed-circle': oneCompleted == true }" >

 <div class = "circle" [ngClass] = "{
        'inprogress-circle': inProgress == 4,
       'completed-circle': oneCompleted == true }" >

это не точное решение, так как вопрос также имеет условие, зависящее от 1 , 2 ... и т. д.

Shashank Vivek 28.05.2019 08:20

Вопрос имеет только 4 условия, как вы можете видеть в блоке переключателей, пусть решает оператор.

Ehsan Kiani 28.05.2019 08:24

Спасибо за ответ.. еще немного об этом.. можете ли вы предложить мне способ изменить значение свойства, которое объявляется внутри класса, но было изменено на основе условия в ngOnInit.. Это обновленное значение должно быть принято вид

Sathya Narayanan GVK 28.05.2019 08:36

Извините, но не могли бы вы объяснить немного больше

Ehsan Kiani 28.05.2019 08:39

да... Например, я получаю @input() inProgress в своем компоненте... Я меняю его значение на основе условия в ngOnInit.. Но изменения не отражаются в моем представлении. Я даже пробовал ngAfterViewInit. .Но полученное начальное значение остается прежним в шаблоне

Sathya Narayanan GVK 28.05.2019 08:43

@Sathyanarayanan, возможно, если вы поставите кавычки над значением, оно будет работать так: inProgress == '1'

Ehsan Kiani 28.05.2019 08:49
stackblitz.com/edit/angular-mbazwq В этом примере у меня есть тестовое свойство, обозначенное как 5..Но я меняю его значение в ngOnInit..Но обновленное значение не отражается в представлении
Sathya Narayanan GVK 28.05.2019 09:00

@Sathyanarayanan, потому что вы не привязываете номер, измените его следующим образом <hello [number]=1></hello>

Ehsan Kiani 28.05.2019 09:06

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

Sathya Narayanan GVK 28.05.2019 09:10

Внутри DOM было четыре узла «Div», поэтому каждый узел вызывался по крайней мере один раз, и каждый раз ваш метод возвращал другое значение, которое снова увеличивалось 4 раза.

Например, это будет ваша последовательность:

1-е обнаружение изменения — метод под названием «–4 раза». 2-е обнаружение изменений — метод под названием «–4 раза». 3-е обнаружение изменения — метод под названием «–4 раза». 4-е обнаружение изменений — метод под названием «–4 раза». Итак, всего ваш метод должен вызываться 16 раз, если есть 4 узла. Попробуйте удалить 1-узел, и ваш метод должен вызываться 4 X 3 = 12 раз. Вот как работает Angular!!

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