У меня есть приложение 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;
}
Ожидаемый результат: Флажок должен показывать, что он установлен, когда пользователь щелкает его один раз. Он также должен показывать, что он не отмечен после одного щелчка.
Фактический результат: Флажок устанавливается только после нескольких кликов
Приведенный выше код приводил к бесконечному циклу. Вместо того, чтобы иметь метод в ngFor, я сделал переменную в машинописи и установил ее = методу. Затем я использовал эту переменную в HTML. Теперь это работает.
HTML:
<div class = "student-history-checkbox" *ngFor = "let item of gradesInCurrentLanguageVar">
ТС:
this.gradesInCurrentLanguagevar = gradesInCurrentLanguage();
НЕ используйте [checked], просто используйте [(ngModel)] = "variable" и измените переменную на true/false. На самом деле это не очень эффективно при каждом изменении и нарезке массива. Это лучше, например. использовать геттер
get selected(){return item.filter(x=>x.selected).map(o=>o.id)}
-или не использовать геттер и вызывать функцию только один раз-