Angular 11 Modal判断数组是否存在指定值,二次打开时数组已赋值仍返回false
问题根因
你的isCourseSelected方法用Array.indexOf()判断对象是否存在,本质是比对内存引用地址:
- 第一次打开弹窗时,选中的课程对象和modal里
courses数组的对象是同一份引用,所以判断生效 - 第二次打开弹窗时,你重新从Firestore拉取了课程列表,每一条都用
new Course().deserialize()生成了全新的对象,和父组件selectedCourses里存的旧对象引用完全不同,所以就算id完全一致,indexOf也会返回-1
修复方案
- 首先修改
CoursesModalComponent中的isCourseSelected方法,改用课程唯一id做比对,不需要依赖对象引用:
public isCourseSelected(course: Course) { // 用id匹配代替引用匹配 return this.modalSelectedCourses.some(cur => cur.id === course.id); }
- (可选优化)修正modal初始状态的获取方式:ngx-bootstrap的modal会自动把
initialState里的属性赋值给模态框组件的同名属性,不需要手动从modalService.config取,构造函数里可以删掉对应行,避免取值错误:
// 删掉构造函数里的这行代码 // this.modalSelectedCourses = this.modalService.config.initialState['modalSelectedCourses'];
- (可选优化)避免父组件
selectedCourses被意外修改:你现在把selectedCourses直接引用传给了modal,modal里修改modalSelectedCourses会直接改动父组件的数组,建议传深拷贝或者严格走单向数据流,由父组件统一维护选中状态。
内容的提问来源于stack exchange,提问作者Jeoxs
相关产品推荐
相关产品推荐

