예제를 통해 몇 분 안에 Angular EventEmitter, @Input, @Output 이해
나는 그것을 보여주기 위해 한 가지 예를 작성했습니다.
문제 시나리오
한 코스에서 두 과목을 배워야 합니다. 각도 및 코드 샌드박스. Angular 주제에는 두 가지 학점을 제공하는 두 가지 작업이 있습니다. 코드 샌드박스에는 하나의 크레딧이 포함된 하나의 작업이 있습니다.
코스를 마치려면 3학점을 이수해야 합니다.
이제 진행 상황을 추적하는 애플리케이션을 작성해야 합니다.
큰 그림
+--------------------+
| Subjects | : Keeping record of credits
| +--------------+ |
| | Tasks | | : To do list, tick off done tasks
| | +---------+ | |
| | | Report | | | : Keeping record of task completed
| | +---------+ | |
| +--------------+ |
+--------------------+
추상 단계
app.comopnent.html
의 내용을 subjects
구성 요소코드
이 다이어그램을 사용하면
@Input
, @Output
및 EventEmitter
가 사용되는 위치를 시각화할 수 있습니다.+----------+ Data Flow +-----------+
| Tasks + ----------> + Subjects |
+----------+ +-----------+
@Output():EventEmitter
+----------+ Data Flow +----------+
| Tasks + ----------> + Report |
+----------+ +----------+
@Input():number
주제 구성 요소
<section id="subjects">
<h4>Subjects</h4>
<div *ngFor="let subject of subjects">
<div>{{subject.desc}} - Credit: {{subject.credit}}</div>
</div>
<app-task
(subjectCompleteEvent)="receiveSubjectCompletion($event)"
></app-task>
</section>
import { Component, OnInit } from "@angular/core";
@Component({
selector: "app-subject",
templateUrl: "./subject.component.html"
})
export class SubjectComponent implements OnInit {
subjects: any[] = [];
ngOnInit(): void {
this.subjects.push({ code: "ng", desc: "Angular", credit: 0 });
this.subjects.push({ code: "sb", desc: "Code Sanbox", credit: 0 });
}
receiveSubjectCompletion(subjectComplete: any) {
const index = this.subjects
.map((subject) => {
return subject.code;
})
.indexOf(subjectComplete.code);
subjectComplete.credit
? this.subjects[index].credit++
: this.subjects[index].credit--;
}
}
작업 구성 요소
<section id="tasks">
<h4>Tasks</h4>
<div *ngFor="let task of todos">
<input
type="checkbox"
(change)="onCheck($event)"
value="{{task.code}}"
/>{{task.desc}}
</div>
<app-report [completed]="taskCompleteCounts"></app-report>
</section>
import { Component, OnInit, Output, EventEmitter } from "@angular/core";
@Component({
selector: "app-task",
templateUrl: "./task.component.html"
})
export class TaskComponent implements OnInit {
// define output type for notifying parent component
@Output() subjectCompleteEvent: EventEmitter<any> = new EventEmitter<any>();
// input value for report (child)
taskCompleteCounts = 0;
todos: any[] = [];
ngOnInit(): void {
this.todos.push({ code: "ng", desc: "Scaffold Angular Project" });
this.todos.push({ code: "ng", desc: "Try EventEmitter, @Input, @Output" });
this.todos.push({ code: "sb", desc: "Try Code Sandbox" });
}
onCheck(event: any) {
if (event.target.checked) {
// update value for child
this.taskCompleteCounts++;
// notify parent
this.subjectCompleteEvent.emit({
code: event.target.value,
credit: true
});
} else {
this.taskCompleteCounts--;
this.subjectCompleteEvent.emit({
code: event.target.value,
credit: false
});
}
}
}
보고서 구성 요소
<section id="report">
<h4>Report</h4>
<div>
Task completed: {{completed}}
</div>
</section>
import { Component, OnInit, Input } from "@angular/core";
@Component({
selector: "app-report",
templateUrl: "./report.component.html"
})
export class ReportComponent implements OnInit {
// define input type. value will be updated from parent
@Input() completed: number;
ngOnInit(): void {}
}
데모
https://codesandbox.io/s/ng-eventemitter-input-output-57r1z
CC-BY-4.0 , 프로그램 코드 CC0 에 따라 이 콘텐츠를 자유롭게 사용할 수 있습니다.
Reference
이 문제에 관하여(예제를 통해 몇 분 안에 Angular EventEmitter, @Input, @Output 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/manet/understand-angular-eventemitter-input-output-in-minutes-with-example-1e0g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)