如何初始化变量以避免'cannot read property <variable> undefined'?
How to initialize variable to avoid 'cannot read property <variable> undefined'?
我正在开发 angular 应用程序。我有一个方法,我试图从 API 调用收到的数据中为变量赋值。
代码
this.adminService.getConfigurations(input).subscribe(
data => {
this.data_Configuration = data[0];
this.data_Configuration_e = data[1]
this.data_Configuration.forEach(itm => {
itm.ApplicableDetails = []
this.data_Configuration_e
.filter(ent => ent.Id == itm.Id)
.forEach(e => {itm.ApplicableDetails.push(e)});
itm.ApplicableLevel.FirstFl = itm.ApplicableDetails.some(e => e.Nm == 'First') ? 'Y' : 'N'
itm.ApplicableLevel.SecondFl = itm.ApplicableDetails.some(e => e.Nm == 'Second') ? 'Y' : 'N'
});
我的 data_Configuration 变量是从接口定义的
public data_Configuration : IConfiguraion[] = []
export interface IConfiguration {
Id: string;
Nm: string;
ApplicableLevel?: IApplicableLevels;
ApplicableDetails?: IDetails [];
}
export interface IApplicableLevels {
FirstFl?: string;
SecondFl?: string;
}
当我尝试使用 itm.ApplicableLevel.FirstFl = itm.ApplicableDetails.some(e => e.Nm == 'First') ? 'Y' : 'N'
行将值分配给 FirstFl
时,出现错误 cannot 属性 FirstFl
of undefined。我应该如何或在哪里初始化 FirstFl
的值以避免此错误?
很可能是 TS Lint 错误,因为 itm.ApplicableLevel
尚未初始化。您可以改为尝试使用 sub-properties FirstFl
和 SecondFl
作为对象来初始化 ApplicableLevel
属性。
您还可以通过在 forEach
循环中用 if
替换不必要的 filter
来跳过 data_Configuration_e
数组的额外迭代级别。
尝试以下方法
this.data_Configuration.forEach(itm => {
itm.ApplicableDetails = [];
this.data_Configuration_e.forEach(e => {
if (ent.Id == itm.Id) {
itm.ApplicableDetails.push(e);
}
});
itm.ApplicableLevel = <IApplicableLevels>{
FirstFl: (itm.ApplicableDetails.some(e => e.Nm == 'First')) ? 'Y' : 'N',
SecondFl: (itm.ApplicableDetails.some(e => e.Nm == 'Second')) ? 'Y' : 'N'
};
});
我正在开发 angular 应用程序。我有一个方法,我试图从 API 调用收到的数据中为变量赋值。 代码
this.adminService.getConfigurations(input).subscribe(
data => {
this.data_Configuration = data[0];
this.data_Configuration_e = data[1]
this.data_Configuration.forEach(itm => {
itm.ApplicableDetails = []
this.data_Configuration_e
.filter(ent => ent.Id == itm.Id)
.forEach(e => {itm.ApplicableDetails.push(e)});
itm.ApplicableLevel.FirstFl = itm.ApplicableDetails.some(e => e.Nm == 'First') ? 'Y' : 'N'
itm.ApplicableLevel.SecondFl = itm.ApplicableDetails.some(e => e.Nm == 'Second') ? 'Y' : 'N'
});
我的 data_Configuration 变量是从接口定义的
public data_Configuration : IConfiguraion[] = []
export interface IConfiguration {
Id: string;
Nm: string;
ApplicableLevel?: IApplicableLevels;
ApplicableDetails?: IDetails [];
}
export interface IApplicableLevels {
FirstFl?: string;
SecondFl?: string;
}
当我尝试使用 itm.ApplicableLevel.FirstFl = itm.ApplicableDetails.some(e => e.Nm == 'First') ? 'Y' : 'N'
行将值分配给 FirstFl
时,出现错误 cannot 属性 FirstFl
of undefined。我应该如何或在哪里初始化 FirstFl
的值以避免此错误?
很可能是 TS Lint 错误,因为 itm.ApplicableLevel
尚未初始化。您可以改为尝试使用 sub-properties FirstFl
和 SecondFl
作为对象来初始化 ApplicableLevel
属性。
您还可以通过在 forEach
循环中用 if
替换不必要的 filter
来跳过 data_Configuration_e
数组的额外迭代级别。
尝试以下方法
this.data_Configuration.forEach(itm => {
itm.ApplicableDetails = [];
this.data_Configuration_e.forEach(e => {
if (ent.Id == itm.Id) {
itm.ApplicableDetails.push(e);
}
});
itm.ApplicableLevel = <IApplicableLevels>{
FirstFl: (itm.ApplicableDetails.some(e => e.Nm == 'First')) ? 'Y' : 'N',
SecondFl: (itm.ApplicableDetails.some(e => e.Nm == 'Second')) ? 'Y' : 'N'
};
});