如何在 Angular 中导出或获取 *ngFor 循环外部的局部变量(v9,Material)
How to export or get LOCAL variables of a *ngFor loop OUTSIDE it in Angular (v9, Material)
Angular 的第一步(第 9 版 Material)。我正在使用以下代码创建一个表单:
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);
}
上面的代码 return 没有给我正确的 data-tag-subjectName
属性,因为我将 [value]
设置为 subject.subjectSemester
到 mat-option
我的 HTML 代码。
如代码注释中所写,我想在 *ngFor
循环之外导出 subjectSemester
和 subjectName
(TS object
) 对于 selected 选项,将它们存储在各自的数据属性(data-tag-subjectSemester
和 data-tag-subjectName
)中,例如,并在我的模板中使用它们作为label
and/ormat-hint
,但是由于某些原因我做不到,例如:
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
以尝试select 想要的变量就像上面修改后的最后一个 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);
}
希望明白我做错了什么,非常感谢。
已找到解决方案,直到找到更好的解决方案:
HTML:
<mat-form-field>
<mat-label>Course</mat-label>
<mat-select
id="subjectSelector"
[formControl]="subjectControl"
(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-form-field>
TS:
onChange(event: any) {
if (event.source.selected === undefined) {
document
.getElementById("subjectSelector")
.setAttribute("data-tag-subjectName", "subjectNone");
document
.getElementById("subjectSelector")
.setAttribute("data-tag-subjectSemester", "semesterNone");
} else {
let target = event.source.selected._element.nativeElement;
let selectedData = {
fieldId: target.getAttribute("id"),
Semester: event.value,
Name: target.innerText.trim()
};
//console.log(selectedData);
//alert(selectedData.Semester);
//alert(selectedData.Name);
document
.getElementById("subjectSelector")
.setAttribute(
"data-tag-subjectName", selectedData.Name.trim()
);
document
.getElementById("subjectSelector")
.setAttribute(
"data-tag-subjectSemester", selectedData.Semester.trim()
);
}
}
Angular 的第一步(第 9 版 Material)。我正在使用以下代码创建一个表单:
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);
}
上面的代码 return 没有给我正确的 data-tag-subjectName
属性,因为我将 [value]
设置为 subject.subjectSemester
到 mat-option
我的 HTML 代码。
如代码注释中所写,我想在 *ngFor
循环之外导出 subjectSemester
和 subjectName
(TS object
) 对于 selected 选项,将它们存储在各自的数据属性(data-tag-subjectSemester
和 data-tag-subjectName
)中,例如,并在我的模板中使用它们作为label
and/ormat-hint
,但是由于某些原因我做不到,例如:
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
以尝试select 想要的变量就像上面修改后的最后一个 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);
}
希望明白我做错了什么,非常感谢。
已找到解决方案,直到找到更好的解决方案:
HTML:
<mat-form-field>
<mat-label>Course</mat-label>
<mat-select
id="subjectSelector"
[formControl]="subjectControl"
(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-form-field>
TS:
onChange(event: any) {
if (event.source.selected === undefined) {
document
.getElementById("subjectSelector")
.setAttribute("data-tag-subjectName", "subjectNone");
document
.getElementById("subjectSelector")
.setAttribute("data-tag-subjectSemester", "semesterNone");
} else {
let target = event.source.selected._element.nativeElement;
let selectedData = {
fieldId: target.getAttribute("id"),
Semester: event.value,
Name: target.innerText.trim()
};
//console.log(selectedData);
//alert(selectedData.Semester);
//alert(selectedData.Name);
document
.getElementById("subjectSelector")
.setAttribute(
"data-tag-subjectName", selectedData.Name.trim()
);
document
.getElementById("subjectSelector")
.setAttribute(
"data-tag-subjectSemester", selectedData.Semester.trim()
);
}
}