在以前的学习过程当中,对于@Input和@Output这两个组件传值方法就不是很熟悉,最近写的功能就用到了这方面的知识,而后又看了一遍教程,趁着这个机会把这两个方法的使用搞明白了。html
/** issue-paper-course-checkbox */ @Input() set primaryIssuePaperCourseList(value: Array<Course>) { /** 设置原列表 */ this.issuePaperState.primaryIssuePaperCourses = value; /** 若是没有值,return */ if (!this.issuePaperState.primaryIssuePaperCourses) { return; } /** 为传入的专业课设置默认选中 */ this.issuePaperState.primaryIssuePaperCourses.forEach((issuePaperCourse: Course) => { this.issuePaperState.issuePaperCheckedMap.set(issuePaperCourse.id, true); }); }
上面是一个课程的选择组件的输入方法,主要目的是在其应用组件获取到user的组卷课程以后,输入到该组件中,而后进行处理,下面看一下应用组件传值的代码:java
/** user -> edit.html **/ [primaryIssuePaperCourseList]="userForm.getRawValue()?.issuePaperCourses"
/** user -> edit.component.ts **/ this.userForm.setValue({ name: user.name, username: user.username, jobNumber: user.jobNumber, sex: user.sex, certificateNumber: user.certificateNumber, roles: user.roles, college: user.college, courses: user.courses, issuePaperCourses: user.issuePaperCourses, });
userForm.getRawValue()?.issuePaperCourses 获取到的就是user的全部组卷课程,获取到这些课程以后,就把这些课程输入给组件:app-issue-paper-course-checkbox,交给该组件处理,以上是为传入的组卷课程设置选中的属性,以便在显示时达到下面的效果:git
@Output是子组件向父组件传值的方法github
/** issue-paper-course-checkbox */ @Output() issuePaperCourseSelect: EventEmitter<Array<Course>> = new EventEmitter(); constructor(private courseService: CourseService) { }
在angular中组件经过定义EventEmitter 事件弹射器
的方式来向处发送数据。从本质上来说,EventEmitter 事件弹射器
也是个可被观察者,它提供的功能是:若是本组件发生了某个事件,就会经过EventEmitter 事件弹射器
来发送通知,若是你想获取到这些通知,那么只须要订阅我便可。引自:教程 3.5.4 @Output()【前】spring
public getAllCheckedCourseList() { /** 初始化专业列表 */ const issuePaperCourseList: Array<Course> = new Array<Course>(); /** 遍历选中的Map */ this.issuePaperState.issuePaperCheckedMap.forEach((value, key) => { /** 遍历菜单列表 */ this.issuePaperCourses.forEach(issuePaperCourse => { if (issuePaperCourse.id === key) { issuePaperCourseList.push(issuePaperCourse); } }); }); this.issuePaperCourseSelect.emit(issuePaperCourseList); }
emit()方法向组件外弹射数据segmentfault
/** user -> edit.html **/ (issuePaperCourseSelect)="bindIssuePaperCourse($event)"
/** user -> edit.component.ts **/ public bindIssuePaperCourse(issuePaperCourseData: Array<Course>) { this.userForm.patchValue({ issuePaperCourses: issuePaperCourseData }); }
子组件把处理完的course等信息传给父组件,父组件进行表单赋值处理,而后从新渲染V层,展现数据。springboot
如下是请求的顺序:app
在以前看教程的时候感受云里雾里的,可是如今再看项目里用到的地方感受挺明朗的,清晰了好多,可能之间的过程有点问题,可是整体上的流程感受仍是明白的,实战是最好的老师。ide
本文做者:河北工业大学梦云智开发团队 张文达学习