繁体   English   中英

我在使用 Typescript 属性初始化时遇到问题

[英]I am having problems with Typescript property initialization

所以我正在制作一个 Spring 和 Angular web 应用程序,并且我在浏览器检查模式下出现问题,例如: ERROR TypeError: Cannot read properties of undefined (reading 'name').

我怀疑问题在于属性初始化。 (这是 app.component.ts)

  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
  [x: string]: any;
  public employees!: Employee[];
  public editEmployee!: Employee;
  public deleteEmployee!: Employee;

我的整个项目没有任何运行时错误,但应用程序运行不正常。 因为它是一个员工经理应用程序,它有一个更新删除和添加 function,更新根本不起作用,添加也不能正常工作。

这是我的 app.component.html:

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
   <a class="navbar-brand" style="color:white;">Employee Manager</a>
   <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor02" aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
   <span class="navbar-toggler-icon"></span>
   </button>
   <div class="collapse navbar-collapse" id="navbarColor02">
      <ul class="navbar-nav mr-auto">
         <li class="nav-item active">
            <a class="nav-link" (click)="onOpenModal(null!, 'add')">Add Employee <span class="sr-only">(current)</span></a>
         </li>
      </ul>
      <form class="form-inline my-2 my-lg-0">
         <input type="search" (ngModelChange)="searchEmployees(key.value)" #key="ngModel" ngModel
          name="key" id="searchName" class="form-control mr-sm-2" placeholder="Search employees..." required>
      </form>
   </div>
 </nav>
 <div class="container" id="main-container">
 <div class="row">
   <div *ngFor="let employee of employees" class="col-md-6 col-xl-3">
      <div class="card m-b-30">
         <div class="card-body row">
            <div class="col-6">
               <a href=""><img src="{{employee?.imageUrl}}" alt="" class="img-fluid rounded-circle w-60"></a>
            </div>
            <div class="col-6 card-title align-self-center mb-0">
               <h5>{{employee?.name}}</h5>
               <p class="m-0">{{employee?.jobTitle}}</p>
            </div>
         </div>
         <ul class="list-group list-group-flush">
            <li class="list-group-item"><i class="fa fa-envelope float-right"></i>{{employee?.email}}</li>
            <li class="list-group-item"><i class="fa fa-phone float-right"></i>Phone : {{employee?.phone}}</li>
         </ul>
         <div class="card-body">
            <div class="float-right btn-group btn-group-sm">
               <a (click)="onOpenModal(employee, 'edit')" class="btn btn-primary tooltips" data-placement="top" data-original-title="Edit"><i class="fa fa-pencil"></i> </a>
               <a (click)="onOpenModal(employee, 'delete')" class="btn btn-secondary tooltips" data-placement="top" data-original-title="Delete"><i class="fa fa-times"></i></a>
            </div>
         </div>
      </div>
   </div>
 </div>
 
 <!-- Add Employee Modal -->
 <div class="modal fade" id="addEmployeeModal" tabindex="-1" role="dialog" aria-labelledby="addEmployeeModalLabel" aria-hidden="true">
   <div class="modal-dialog" role="document">
     <div class="modal-content">
        <div class="modal-header">
           <h5 class="modal-title" id="addEmployeeModalLabel">Add Employee</h5>
           <button type="button" class="close" data-dismiss="modal" aria-label="Close">
           <span aria-hidden="true">&times;</span>
           </button>
        </div>
        <div class="modal-body">
           <form #addForm="ngForm" (ngSubmit)="onAddEmployee(addForm)">
           <div class="form-group">
              <label for="name">Name</label>
              <input type="text" ngModel name="name" class="form-control" id="name" placeholder="Name" required>
           </div>
           <div class="form-group">
              <label for="email">Email Address</label>
              <input type="email" ngModel name="email" class="form-control" id="email" placeholder="Email" required>
           </div>
           <div class="form-group">
              <label for="phone">Job title</label>
              <input type="text" ngModel name="jobTitle" class="form-control" id="jobTile" placeholder="Job title" required>
           </div>
           <div class="form-group">
              <label for="phone">Phone</label>
              <input type="text" ngModel name="phone" class="form-control" id="phone" placeholder="Phone" required>
           </div>
           <div class="form-group">
              <label for="phone">Image URL</label>
              <input type="text" ngModel name="imageUrl" class="form-control" id="imageUrl" placeholder="Image URL" required>
           </div>
           <div class="modal-footer">
              <button type="button" id="add-employee-form" class="btn btn-secondary" data-dismiss="modal">Close</button>
              <button [disabled]="addForm.invalid" type="submit" class="btn btn-primary" >Save changes</button>
           </div>
           </form>
        </div>
     </div>
   </div>
   </div>
 
 <!-- Edit Modal -->
 <div class="modal fade" id="updateEmployeeModal" tabindex="-1" role="dialog" aria-labelledby="employeeEditModalLabel" aria-hidden="true">
   <div class="modal-dialog" role="document">
      <div class="modal-content">
         <div class="modal-header">
            <h5 class="modal-title" id="updateEmployeeModalLabel">Edit Employee {{editEmployee.name}}</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
            </button>
         </div>
         <div class="modal-body">
            <form #editForm="ngForm">
               <div class="form-group">
                  <label for="name">Name</label>
                  <input type="text" ngModel="{{editEmployee.name}}" name="name" class="form-control" id="name" aria-describedby="emailHelp" placeholder="Name">
               </div>
               <input type="hidden" ngModel="{{editEmployee.id}}" name="id" class="form-control" id="id" placeholder="Email">
               <input type="hidden" ngModel="{{editEmployee.employeeCode}}" name="userCode" class="form-control" id="userCode" placeholder="Email">
               <div class="form-group">
                  <label for="email">Email Address</label>
                  <input type="email" ngModel="{{editEmployee.email}}" name="email" class="form-control" id="email" placeholder="Email">
               </div>
               <div class="form-group">
                  <label for="phone">Job title</label>
                  <input type="text" ngModel="{{editEmployee.jobTitle}}" name="jobTitle" class="form-control" id="jobTitle" placeholder="Job title">
               </div>
               <div class="form-group">
                  <label for="phone">Phone</label>
                  <input type="text" ngModel="{{editEmployee.phone}}" name="phone" class="form-control" id="phone" name="phone" placeholder="Phone">
               </div>
               <div class="form-group">
                  <label for="phone">Image URL</label>
                  <input type="text" ngModel="{{editEmployee.imageUrl}}" name="imageUrl" class="form-control" id="imageUrl" placeholder="Image URL">
               </div>
               <div class="modal-footer">
                  <button type="button" id="" data-dismiss="modal" class="btn btn-secondary">Close</button>
                  <button (click)="onUpdateEmployee(editForm.value)" data-dismiss="modal" class="btn btn-primary" >Save changes</button>
               </div>
            </form>
         </div>
      </div>
   </div>
 </div>
 
 <!-- Delete Modal -->
 <div class="modal fade" id="deleteEmployeeModal" tabindex="-1" role="dialog" aria-labelledby="deleteModelLabel" aria-hidden="true">
   <div class="modal-dialog" role="document">
      <div class="modal-content">
         <div class="modal-header">
            <h5 class="modal-title" id="deleteModelLabel">Delete Employee</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
            </button>
         </div>
         <div class="modal-body">
            <p>Are you sure you want to delete employee {{deleteEmployee.name}}?</p>
            <div class="modal-footer">
               <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button>
               <button (click)="onDeleteEmployee(deleteEmployee.id)" class="btn btn-danger" data-dismiss="modal">Yes</button>
            </div>
         </div>
      </div>
   </div>
 </div>
 </div>
 
 <!-- Notification for no employees -->
 <div *ngIf="employees?.length == 0" class="col-lg-12 col-md-12 col-xl-12">
 <div class="alert alert-info" role="alert">
   <h4 class="alert-heading">NO EMPLOYEES!</h4>
   <p>No Employees were found.</p>
 </div>
 </div>

有没有人知道如何解决属性初始化问题(如果有的话)。 我是否可以降级 Angular 版本,我已经尝试将 StrictPropertyInitalization 设置为 false,但它没有多大作用。 提前致谢!

编辑:显示这一点的课程不必在属性初始化中添加“,”。 他们的应用程序运行良好。 所以我怀疑这一点。

这是由您尝试从中读取属性的 object 引起的。在呈现模板时,名称尚未初始化。

我已经重新创建了类似于您的项目的东西,并设法在模板上使用 object 之前使用 *ngIf 来消除错误。

检查我在本地做了什么,以防它帮助你:

app.component.html

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" style="color:white;">Employee Manager</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor02" aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarColor02">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
                <a class="nav-link" (click)="onOpenModal(null!, 'add')">Add Employee <span class="sr-only">(current)</span></a>
            </li>
        </ul>
        <form class="form-inline my-2 my-lg-0">
            <input type="search" (ngModelChange)="searchEmployees(key.value)" #key="ngModel" ngModel name="key" id="searchName" class="form-control mr-sm-2" placeholder="Search employees..." required>
        </form>
    </div>
</nav>
<div class="container" id="main-container">
    <div class="row">
        <div *ngFor="let employee of employees" class="col-md-6 col-xl-3">
            <div class="card m-b-30">
                <div class="card-body row">
                    <div class="col-6">
                        <a href=""><img src="{{employee?.imageUrl}}" alt="" class="img-fluid rounded-circle w-60"></a>
                    </div>
                    <div class="col-6 card-title align-self-center mb-0">
                        <h5>{{employee?.name}}</h5>
                        <p class="m-0">{{employee?.jobTitle}}</p>
                    </div>
                </div>
                <ul class="list-group list-group-flush">
                    <li class="list-group-item"><i class="fa fa-envelope float-right"></i>{{employee?.email}}</li>
                    <li class="list-group-item"><i class="fa fa-phone float-right"></i>Phone : {{employee?.phone}}</li>
                </ul>
                <div class="card-body">
                    <div class="float-right btn-group btn-group-sm">
                        <a (click)="onOpenModal(employee, 'edit')" class="btn btn-primary tooltips" data-placement="top" data-original-title="Edit"><i class="fa fa-pencil"></i> </a>
                        <a (click)="onOpenModal(employee, 'delete')" class="btn btn-secondary tooltips" data-placement="top" data-original-title="Delete"><i class="fa fa-times"></i></a>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- Add Employee Modal -->
    <div class="modal fade" id="addEmployeeModal" tabindex="-1" role="dialog" aria-labelledby="addEmployeeModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="addEmployeeModalLabel">Add Employee</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <form #addForm="ngForm" (ngSubmit)="onAddEmployee(addForm)" *ngIf="editEmployee">
                        <div class="form-group">
                            <label for="name">Name</label>
                            <input type="text" [(ngModel)]="editEmployee.name" name="name" class="form-control" id="name" placeholder="Name" required>
                        </div>
                        <div class="form-group">
                            <label for="email">Email Address</label>
                            <input type="email" [(ngModel)]="editEmployee.email" name="email" class="form-control" id="email" placeholder="Email" required>
                        </div>
                        <div class="form-group">
                            <label for="phone">Job title</label>
                            <input type="text"  [(ngModel)]="editEmployee.jobTitle" name="jobTitle" class="form-control" id="jobTile" placeholder="Job title" required>
                        </div>
                        <div class="form-group">
                            <label for="phone">Phone</label>
                            <input type="text"  [(ngModel)]="editEmployee.phone" name="phone" class="form-control" id="phone" placeholder="Phone" required>
                        </div>
                        <div class="form-group">
                            <label for="phone">Image URL</label>
                            <input type="text"  [(ngModel)]="editEmployee.imageUrl" name="imageUrl" class="form-control" id="imageUrl" placeholder="Image URL" required>
                        </div>
                        <div class="modal-footer">
                            <button type="button" id="add-employee-form" class="btn btn-secondary" data-dismiss="modal">Close</button>
                            <button [disabled]="addForm.invalid" type="submit" class="btn btn-primary">Save changes</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>

    <!-- Edit Modal -->
    <div class="modal fade" id="updateEmployeeModal" tabindex="-1" role="dialog" aria-labelledby="employeeEditModalLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="updateEmployeeModalLabel">Edit Employee <span *ngIf="editEmployee">{{editEmployee.name}}</span></h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body">
                    <form #editForm="ngForm" *ngIf="editEmployee">
                        <div class="form-group">
                            <label for="name">Name</label>
                            <input type="text" [(ngModel)]="editEmployee.name" name="name" class="form-control" id="name" aria-describedby="emailHelp" placeholder="Name">
                        </div>
                        <input type="hidden" [(ngModel)]="editEmployee.id" name="id" class="form-control" id="id" placeholder="Email">
                        <input type="hidden" ngModel="editEmployee.employeeCode" name="userCode" class="form-control" id="userCode" placeholder="Email">
                        <div class="form-group">
                            <label for="email">Email Address</label>
                            <input type="email" [(ngModel)]="editEmployee.email" name="email" class="form-control" id="email" placeholder="Email">
                        </div>
                        <div class="form-group">
                            <label for="phone">Job title</label>
                            <input type="text" [(ngModel)]="editEmployee.jobTitle" name="jobTitle" class="form-control" id="jobTitle" placeholder="Job title">
                        </div>
                        <div class="form-group">
                            <label for="phone">Phone</label>
                            <input type="text" [(ngModel)]="editEmployee.phone" name="phone" class="form-control" id="phone" name="phone" placeholder="Phone">
                        </div>
                        <div class="form-group">
                            <label for="phone">Image URL</label>
                            <input type="text" [(ngModel)]="editEmployee.imageUrl" name="imageUrl" class="form-control" id="imageUrl" placeholder="Image URL">
                        </div>
                        <div class="modal-footer">
                            <button type="button" id="" data-dismiss="modal" class="btn btn-secondary">Close</button>
                            <button (click)="onUpdateEmployee(editForm.value)" data-dismiss="modal" class="btn btn-primary">Save changes</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>

    <!-- Delete Modal -->
    <div class="modal fade" id="deleteEmployeeModal" tabindex="-1" role="dialog" aria-labelledby="deleteModelLabel" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="deleteModelLabel">Delete Employee</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                </div>
                <div class="modal-body" *ngIf="deleteEmployee">
                    <p>Are you sure you want to delete employee {{deleteEmployee.name}}?</p>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-dismiss="modal">No</button>
                        <button (click)="onDeleteEmployee(deleteEmployee.id)" class="btn btn-danger" data-dismiss="modal">Yes</button>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- Notification for no employees -->
<div *ngIf="employees?.length == 0" class="col-lg-12 col-md-12 col-xl-12">
    <div class="alert alert-info" role="alert">
        <h4 class="alert-heading">NO EMPLOYEES!</h4>
        <p>No Employees were found.</p>
    </div>
</div>

app.component.ts

import { Component } from '@angular/core';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss']
})
export class AppComponent {
    title = 'conSpring';
    employees: Array<Employee> = [];
    editEmployee!: Employee;
    deleteEmployee!: Employee;

    public onOpenModal(a: any, b: string): void {
    }

    public onAddEmployee(a: any): void {
    }

    public searchEmployees(a: any): void {
    }

    public onUpdateEmployee(a: any): void {
    }

    public onDeleteEmployee(a: any): void {
    }
}

export class Employee {
    id!: number;
    employeeCode!: string;
    name!: string;
    jobTitle!: string;
    email!: string;
    phone!: string;
    imageUrl!: string;
}

app.module.ts

import { HttpClientModule } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        BrowserModule,
        HttpClientModule,
        FormsModule
    ],
    providers: [],
    bootstrap: [AppComponent]
})
export class AppModule { }

当然,对我来说,它显示了一些不可用的东西,因为我错过了来自后端的数据和获取它的连接,你应该拥有(我相信)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM