Ионный угловой *ngДля трубы

Я пытаюсь понять, почему мой фильтр канала *ngFor не срабатывает, он работает для «второго флажка», но не для «первого флажка», см. пример ниже.

Я добавил два флажка, которые хочу активировать фильтр канала в *NgFor. Как я могу установить «флажок один», чтобы активировать фильтр NgFor PIPE? Похоже, что при использовании объекта json в качестве параметра не обнаружено никаких изменений. Кроме того, я попробовал обнаружить изменения, но это не сработало.

Вид

<!-- checkbox one -->
<ion-checkbox labelPlacement = "end" [checked] = "checkbox_one.isChecked" (ionChange) = "setColorOne(checkbox_one.isChecked)">filter one</ion-checkbox>

<!-- checkbox two -->
<ion-checkbox labelPlacement = "end" [checked] = "checkbox_two" (ionChange) = "setColorTwo(checkbox_two)">filter two</ion-checkbox>
    
<div *ngFor = "let index of [0,1] | color : checkbox_one"></div>
<div *ngFor = "let index of [0,1]  | color : checkbox_two"></div>
    

Контроллер

  public checkbox_two = true;
  public checkbox_one =
    {
      isChecked: true
    }

  public setColorOne(color:any) {
    this.checkbox_one.isChecked = !color;
    //this.changeDetection.detectChanges();
  }

   
  public setColorTwo(color:boolean) {
    this.checkbox_two = !color;
  }

Трубка

  transform(items: any[], colors:any): any[] {
    console.info("PIPE");
    return items;
  }
Тестирование функциональных 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
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Есть 2 варианта использования: primitive type и non primitive type.

  1. Примитивный тип

public checkbox_two = true;

  public setColorTwo(color: boolean) {
    this.checkbox_two = !color;
  }

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

  1. Непримитивный тип (объект)

Помните механизм трубы:

Если это правда, канал является чистым, а это означает, что метод Transform() вызывается только тогда, когда изменяются его входные аргументы

В этом случае канал не вызывается, поскольку аргумент не изменился:

 public setColorOne(color:any) {
    this.checkbox_one.isChecked = !color;
    //this.changeDetection.detectChanges();
  }

Вы должны обновить свой объект таким образом, чтобы сообщить каналу, что ссылка была изменена:

  public checkbox_one = {
    isChecked: true,
  };

  public setColorOne(color: any) {
    this.checkbox_one = {
      isChecked: !color
    }
  }

Спасибо за информацию и решение, которое отлично работает. Прочитав об этой проблеме, я нашел аналогичное решение проблемы, и, к сведению, это было: this.checkbox_one= JSON.parse(JSON.stringify(this.checkbox_one));

rikard 14.03.2024 23:23

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