错误类型错误:无法读取tipo-struttura.component.ts(angular+spring+sql)未定义的属性“id”

Posted

技术标签:

【中文标题】错误类型错误:无法读取tipo-struttura.component.ts(angular+spring+sql)未定义的属性“id”【英文标题】:ERROR TypeError: Cannot read property 'id' of undefined at tipo-struttura.component.ts (angular+spring+sql) 【发布时间】:2021-04-22 16:23:00 【问题描述】:

在我的 Spring + Angular + mysql 项目中,我必须管理三个列表,其中第三个取决于第二个,第二个取决于用户在第一个中所做的选择。我正在尝试连接第一个和第二个列表,但它给了我以下错误:

错误类型错误:无法读取未定义的属性“id” 在tipo-struttura.component.ts:36

我已经使用两个列表之间的链接创建了数据库查询:

CREATE TABLE `struttura` (
  `id` bigint(20) NOT NULL,
  `struttura` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `struttura` (`id`, `struttura`) VALUES
(1, 'Strutture di elevazione verticale'),
(2, 'Strutture di elevazione orizzontale'),
(3, 'Strutture di elevazione inclinate'),
(4, 'Strutture di elevazione spaziali'),
(5, 'Aperture');


CREATE TABLE `struttura_due` (
  `id` bigint(20) NOT NULL,
  `struttura_due` varchar(255) DEFAULT NULL,
  `struttura_id_id` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `struttura_due` (`id`, `struttura_due`, `struttura_id_id`) VALUES
(1, 'Strutture a pareti portanti in muratura', 1),
(2, 'Strutture per impalcati piani', 2),
(3, 'Strutture per coperture piane', 2),
(4, 'Strutture per coperture inclinate', 3),
(5, 'Strutture voltate', 4);

ALTER TABLE `struttura`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `struttura_due`
  ADD PRIMARY KEY (`id`),
  ADD KEY `FK9eqhylq6sc1yseu3cglwffnsy` (`struttura_id_id`);

ALTER TABLE `struttura`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

ALTER TABLE `struttura_due`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

ALTER TABLE `struttura_due`
  ADD CONSTRAINT `FK9eqhylq6sc1yseu3cglwffnsy` FOREIGN KEY (`struttura_id_id`) REFERENCES `struttura` (`id`);
COMMIT;

前端 struttura.ts

export class Struttura 
    id: number
    struttura: string   

struttura-due.ts

import  Struttura  from "./struttura"

export class StrutturaDue 
    id: number
    struttura_due: string
    struttura_id_id: Struttura

elementi-struttura.service.ts

import  Injectable  from '@angular/core';
import  Observable  from 'rxjs';
import  HttpClient  from '@angular/common/http';
import  Struttura  from '../classes/strutture/struttura';
import  StrutturaDue  from '../classes/strutture/struttura-due';

@Injectable(
  providedIn: 'root'
)
export class ElementiStrutturaService 

  url: string

  constructor(private http: HttpClient) 
    this.url = 'http://localhost:8080/';
   

   public getStruttura():Observable<Struttura[]> 
     return this.http.get<Struttura[]>(this.url + "struttura");
   

   public getStrutturaDue():Observable<StrutturaDue[]> 
     return this.http.get<StrutturaDue[]>(this.url + "strutturaDue");
   

  

tipo-struttura.component.ts(第 36 行错误 -> if (t.struttura_id_id.id === this.strutt[index].id)

import  Component, OnInit  from '@angular/core';
import  Struttura  from '../classi-servizi/classes/strutture/struttura'
import  StrutturaDue  from '../classi-servizi/classes/strutture/struttura-due'
import  ElementiStrutturaService  from '../classi-servizi/service/elementi-struttura.service';
@Component(
  selector: 'app-tipo-struttura',
  templateUrl: './tipo-struttura.component.html',
  styleUrls: ['./tipo-struttura.component.css']
)
export class TipoStrutturaComponent implements OnInit 

  strutt: Struttura[];
  strutt2: StrutturaDue[];

  selectedElement = [];
  selectedIndex: number;

  constructor(
    private service: ElementiStrutturaService
  )  

  ngOnInit() 
    this.service.getStruttura().subscribe(data => 
      this.strutt = data; 
      console.log(this.strutt)
    )
    this.service.getStrutturaDue().subscribe(data => 
      this.strutt2 = data;
      console.log(this.strutt2)
    )
  
  
  onChange(index: number) 
    this.selectedElement = []
    this.strutt2.forEach(t => 
      if (t.struttura_id_id.id === this.strutt[index].id) 
        this.selectedElement.push(t)
      
    )
    this.selectedIndex = 0;
  


tipo-struttura.component.html

<div class="container">
    <div class="titolo" style="text-align: center;margin-top: 30px; font-size: 30px;">
        <p><b>INDIVIDUAZIONE DELLE STRUTTURE</b></p>
    </div>
    <div class="card my-5">
        <div class="card-body">
            <form>
                <div class="form-group">
                    <label for="struttura">
            <p><b>Struttura</b></p>
          </label>
                    <select value="structure" class="form-control" id="structure" (change)="onChange($event.target.value)" name="struttura">
            <option selected disabled>
              Seleziona
            </option>
            <option [value]="i" *ngFor="let array of strutt; index as i">
               array.struttura 
            </option>
          </select>
                    <label></label>
                    <p><b>Struttura Due</b></p>
                    <select [(ngModel)]="selectedIndex" style="margin-top: 30px;" value="struttura" valure="struttura" class="form-control" id="structure" name="struttura">
            <option selected disabled>
              Seleziona
            </option>
            <option [value]="i" *ngFor="let arrays of selectedElement; index as i;">
               arrays.strutturaDue 
            </option>
          </select>

【问题讨论】:

【参考方案1】:

解决这个问题的一个好方法是,在检查 id 是否相同之前,检查对象是否存在。

       if (t.struttura_id_id !== undefined) 
         if (t.struttura_id_id.id === this.strutt[index].id) 
           this.selectedElement.push(t)
         
       ;

这可能是因为您的数据库中有一些数据损坏。

换个话题:

在连接数据时使用模板字符串是一种很好的做法。所以,你可以在你的服务上使用它。

代替:

   public getStruttura():Observable<Struttura[]> 
     return this.http.get<Struttura[]>(this.url + "struttura");
   

用途:

   public getStruttura():Observable<Struttura[]> 
     return this.http.get<Struttura[]>(`$this.url$struttura`);
   

【讨论】:

是的,它有效。第一个“未定义”错误消失了。但是字符串模板在 struttura 中给了我这个错误:“找不到名称 'struttura'。你的意思是 'Struttura' 吗?” 好吧,我必须在 $this.url$"struttura" 中使用 " 周围的 struttura 进行更改 是的,在这种情况下,它是一个简单的字符串,而不是一个变量,你可以输入这样的词:$this.urlstruttura 需要添加变量时使用字符串模板即可 你能帮我解决稍后与同一项目相关的问题吗?您可以在我的 Stack 个人资料中找到它 你有链接吗?

以上是关于错误类型错误:无法读取tipo-struttura.component.ts(angular+spring+sql)未定义的属性“id”的主要内容,如果未能解决你的问题,请参考以下文章

错误类型错误:无法在styles.css 中读取null 的属性(读取'classList')

错误类型错误:无法读取未定义的属性(读取“nativeElement”)

错误类型错误:无法读取未定义的属性“匹配”

错误:`未捕获(承诺中)类型错误:无法读取未定义的属性'doc'`

错误类型错误:无法读取未定义的属性“getUsers”

错误类型错误:无法读取未定义的属性“未读”