javascript - 无法读取未定义的属性,即使我已经对其进行了初始化。(角度)
问题描述
我正在制作具有 3 个类别的过滤器,所以我设计了一个模型:
export class filtersApplied {
public subjects: string[] = [];
public price: string[] = [];
public ratings: number[] = [];
}
一旦用户从这些类别中的任何一个应用过滤器,我希望将所有这些选择的值添加到模型的相应数组中。假设我选择了“ENGLISH”、“MATHEMATICS”和“SCIENCE”,所以我想将它们插入到“filtersApplied.subjects”中,以便它们可以在后端进行处理。
allFiltersApplied 是一个filtersApplied 类型的变量
allFiltersApplied: filtersApplied;
<ul class="filter-category-list">
<li>
<label class="filters-label">
<input
type="checkbox"
class="filter-input"
value="English"
(change)="searchBySubject($event)"
/>English
<span class="filter-num">(123)</span>
</label>
</li>
<li>
<label class="filters-label">
<input
type="checkbox"
class="filter-input"
value="Physics"
(change)="searchBySubject($event)"
/>Physics
<span class="filter-num">(123)</span>
</label>
</li>
<li>
<label class="filters-label">
<input
type="checkbox"
class="filter-input"
value="Chemistry"
(change)="searchBySubject($event)"
/>Chemistry
<span class="filter-num">(123)</span>
</label>
</li>
<li>
<label class="filters-label">
<input
type="checkbox"
class="filter-input"
value="Mathematics"
(change)="searchBySubject($event)"
/>Mathematics
<span class="filter-num">(123)</span>
</label>
</li>
<li>
<label class="filters-label">
<input
type="checkbox"
class="filter-input"
value="Science"
(change)="searchBySubject($event)"
/>Science
<span class="filter-num">(123)</span>
</label>
</li>
</ul>
这是我在 ts 文件中的函数:
searchBySubject($event) {
var subject = $event.target.value;
console.log(subject); //1
console.log(this.allFiltersApplied); //2
console.log(this.allFiltersApplied.subjects); //3
}
我为 console.log(this.allFiltersApplied) 得到的输出是未定义的;我为 console.log(this.allFiltersApplied.subjects) 得到的输出是 Cannot read property 'subjects' of undefined at SearchResultsComponent.searchBySubject;
**我的问题是:**
1. 为什么它显示未定义
2. 如果它已经存在,为什么不能阅读主题。我什至不能推送像 this.allFiltersApplied.subjects.push("ENGLISH"); 这样的任何值。
请帮助我,我没有得到,为什么会这样
解决方案
你说这allFiltersApplied
是一个变量,但我假设你的意思是它是某个类的属性。(变量将用const
,let
或之前的 ,声明var
。)
假设您已在某个类中声明它,如下所示:
export class MyClass {
allFiltersApplied: filtersApplied;
}
你只是声明了它,你还没有初始化它,所以它的值将是undefined
.
将其声明为特定类型只是确保在使用它时,它会在其声明类型的约束范围内使用。
因此,如果您希望它从 的基本结构开始filtersApplied
,使用可以将值推入其中的数组,您还需要对其进行初始化。由于filtersApplied
被定义为 aclass
而不是 a type
,你可以像这样实例化它:
export class MyClass {
allFiltersApplied: filtersApplied = new filtersApplied();
}
但是,如果您将它定义为只是 a type
(只是为了强制其类型)而不是 full class
,您可以像这样初始化您的属性:
export class MyClass {
allFiltersApplied: filtersApplied = {
subjects: [],
price: [],
ratings: []
};
}
几张临别笔记:
- 类和类型的约定是它们是 UpperCamelCase,如果您想遵循约定,
filtersApplied
可能应该是这样。FiltersApplied
- 诸如“先生,我对 Angular 没有太多经验,但恕我直言,我认为您也没有多少经验”之类的评论是针对那些花时间尝试帮助您的人,例如 @Pointy(其声誉超过 358,000顺便说一下,写这篇文章的时间)可能会阻止其他人试图帮助你。
推荐阅读
- dax - DAX STUDIO - 使用列 var 结果作为 Evaluate Function 的输入
- flutter - 如何从 Flutter Hive 中检索 HiveList
- javascript - Javascript 循环、异步函数和无头浏览器
- mysql - 成功POST表单数据到Express App,使用sequelize插入MySQL数据库
- php - 为什么 Symfony 的自动装配会给我一个类的调试版本实例?我可以绕过这个以在开发模式下获得常规版本吗?
- java - 如何在图片/矩阵中递归旅行
- rust - 如何存储来自 DrawingArea::connect_draw 的信号 ID?
- c - STM32F03和ESP-8266-01之间的UART通信
- javascript - 通过node js向程序发送CLI命令
- salesforce-marketing-cloud - 无法为 Salesforce Marketing Cloud 令牌交换“代码”