Angular: почему событие (изменение) для флажка срабатывает только после двойного щелчка?

У меня есть приложение Angular со списком флажков (mat-checkbox), которое правильно отображает значения на английском или испанском языках в зависимости от локали.

Проблема: Однако сам флажок не всегда проверяется, когда пользователь нажимает на него. Кажется, требуется двойной щелчок. Что могло вызвать что-то подобное?

я пробовал:

компонент.html:

<div class = "student-history-checkbox" *ngFor = "let item of gradesInCurrentLanguage()">
    <mat-checkbox [checked] = "isChecked(item.ID)" (change) = "onChangeCB($event, item.ID)">{{item.Value}}</mat-checkbox>
</div>

компонент.ts:

public gradesInCurrentLanguage() : CGenericRecord[] {
    return this.ms.XFormForLocale(this.grades, this.localeId);
}


isChecked(ID : number)
{
    return (this.gradeInfo.Grades.indexOf(ID) > -1) ? true : false;
}



onChangeCB(event : any, id : number)
{
    if (event.checked && this.gradeInfo.Grades.indexOf(id) == -1){
        this.gradeInfo.Grades.push(id);
    }else{
        let index = this.gradeInfo.Grades.indexOf(id);
        this.gradeInfo.Grades.splice(index, 1);
    }       
}

интерфейс.ts:

export class CGenericRecord
{
    constructor(
        public ID: number, 
        public Value: string) 
    {}
}
export interface GenericTranslationRecord {
    ID      :   number,
    Value   :   string,
    SpanishValue: string
}

сервис.тс:

public XFormForLocale(grades: GenericTranslationRecord[], localeId: string) : CGenericRecord[] {
    let recs :CGenericRecord[] = [];
    for (let g of grades) 
    {
        recs.push( new CGenericRecord(d.ID, localeId === "es" ? d.SpanishValue : d.Value));
    }
    return recs;
}

Ожидаемый результат: Флажок должен показывать, что он установлен, когда пользователь щелкает его один раз. Он также должен показывать, что он не отмечен после одного щелчка.

Фактический результат: Флажок устанавливается только после нескольких кликов

НЕ используйте [checked], просто используйте [(ngModel)] = "variable" и измените переменную на true/false. На самом деле это не очень эффективно при каждом изменении и нарезке массива. Это лучше, например. использовать геттер get selected(){return item.filter(x=>x.selected).map(o=>o.id)} -или не использовать геттер и вызывать функцию только один раз-

Eliseo 30.05.2019 22:27
Тестирование функциональных 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
1
999
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Приведенный выше код приводил к бесконечному циклу. Вместо того, чтобы иметь метод в ngFor, я сделал переменную в машинописи и установил ее = методу. Затем я использовал эту переменную в HTML. Теперь это работает.

HTML:

<div class = "student-history-checkbox" *ngFor = "let item of gradesInCurrentLanguageVar">

ТС:

this.gradesInCurrentLanguagevar = gradesInCurrentLanguage();

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