Первые шаги в Angular (с материалом в версии 9). Я создаю форму со следующим кодом:
HTML:
<mat-form-field>
<mat-label>Course</mat-label>
<mat-select
[formControl]="subjectControl"
[attr.data-tag-subjectSemester]="this.subjectControl.value
? this.subjectControl.value.trim()
: ''
[attr.data-tag-subjectName]="this.subjectControl.value
? this.subjectControl.value.trim()
: ''
(selectionChange)="onChange($event)"
required
>
<mat-option>-- None --</mat-option>
<mat-optgroup *ngFor="let course of subjects" [label]="course.semester" [disabled]="course.disabled">
<mat-option *ngFor="let subject of course.courses" [value]="subject.subjectSemester"><!--For now, here I have to set `[value]` to `.subjectName` OR `.subjectSemester` to show it into the `data-tag`, but the question is How to export BOTH variables outside the `*ngFor` loop, if I can choose only one variable as option to show it as value?-->
{{ subject.subjectName }}
</mat-option>
</mat-optgroup>
</mat-select>
<mat-hint>
{{
this.subjectControl.value
? this.subjectControl.value.trim()
: ''
}}
</mat-hint>
</mat-form-field>
TS:
export interface SubjectGroup {
disabled?: boolean;
semester: string;
courses: Subject[];
}
export interface Subject {
subjectName: string;
subjectSemester: string;
}
subjectControl = new FormControl("", Validators.required);
export class FormComponent implements OnInit {
subjectControl = new FormControl("", Validators.required);
subjects: SubjectGroup[] = [
{
disabled: false,
semester: "Semester 1",
courses: [
{
subjectName: "Course 1",
subjectSemester: "1° Semester"
},
{
subjectName: "Course 2",
subjectSemester: "1° Semester"
},
{
subjectName: "Course 3",
subjectSemester: "1° Semester"
},
{
subjectName: "Course 4",
subjectSemester: "1° Semester"
},
{
subjectName: "Course 5",
subjectSemester: "1° Semester"
}
]
},
{
disabled: false,
semester: "Semester 2",
courses: [
{
subjectName: "Course 1",
subjectSemester: "2° Semester"
},
{
subjectName: "Course 2",
subjectSemester: "2° Semester"
},
{
subjectName: "Course 3",
subjectSemester: "2° Semester"
},
{
subjectName: "Course 4",
subjectSemester: "2° Semester"
}
]
}
];
}
onChange(event: { stopPropagation: () => void }) {
let subjectSemester = this.subjectControl.value; /* here I would to export both subjectName and subjectSemester; I tried in a way like `let subjectSemester = this.subjectControl.value?.subjectSemester;` and `let subjectName = this.subjectControl.value?.subjectName;`, but I can't get it! What I'm doing wrong?*/
alert(subjectSemester);
}
Приведенный выше код не возвращает мне правильный атрибут data-tag-subjectName
, потому что я установил [value]
в subject.subjectSemester
в mat-option
моего HTML кода.
Как написано в комментариях к коду, я хотел бы экспортировать за пределы *ngFor
l oop и subjectSemester
и subjectName
(из TS object
) для выбранной опции, например, сохранить их в соответствующих атрибутах данных (data-tag-subjectSemester
и data-tag-subjectName
) и использовать их в моем шаблоне как label
и / или mat-hint
, но по какой-то причине я не могу do , например:
TS:
onChange(event: { stopPropagation: () => void }) {
let subjectSemester = this.subjectControl.value?.subjectSemester;
let subjectName = this.subjectControl.value?.subjectName;
alert(subjectName + ", " + subjectSemester);
}
Я пытался изменить код с помощью [ngValue]="subject"
для mat-option
в HTML код, чтобы экспортировать value
как object
, чтобы попытаться выбрать нужную переменную, как в вышеописанной модифицированной последней функции onChange
, но таким образом я получаю undefined
переменные и, таким образом, пустые поля в моей форме. .
В идеале хотелось бы чтобы следующий код работал:
HTML:
<mat-form-field>
<mat-label>Course</mat-label>
<mat-select
[formControl]="subjectControl"
[attr.data-tag-subjectSemester]="this.subjectControl.value?.subjectSemester
? this.subjectControl.value?.subjectSemester.trim()
: ''
[attr.data-tag-subjectName]="this.subjectControl.value.?subjectName
? this.subjectControl.value?.subjectName.trim()
: ''
(selectionChange)="onChange($event)"
required
>
<mat-option>-- None --</mat-option>
<mat-optgroup *ngFor="let course of subjects" [label]="course.semester" [disabled]="course.disabled">
<mat-option *ngFor="let subject of course.courses" [value]="subject.subjectSemester">
{{ subject.subjectName }}
</mat-option>
</mat-optgroup>
</mat-select>
<mat-hint>
{{
this.subjectControl.value?.subjectSemester
? this.subjectControl.value?.subjectSemester.trim()
: ''
}}
</mat-hint>
</mat-form-field>
TS:
onChange(event: { stopPropagation: () => void }) {
let subjectSemester = this.subjectControl.value?.subjectSemester;
let subjectName = this.subjectControl.value?.subjectName;
alert(subjectName + ", " + subjectSemester);
}
Надеюсь понять, что я делаю не так, спасибо большое.