Я пытаюсь создать форму обновления в Angular. Я пробовал много вещей, но опять же я не очень знаком с Angular для начала. Это кажется довольно простым, хотя, я получаю данные, используя метод ngOnInit()
(который возвращает правильные данные). Пользовательские данные отображаются в полях ввода, но затем появляется ошибка.
Это ошибка, которую я получаю в консоли:
UpdateComponent.html:6 ERROR TypeError: Cannot read property 'firstName' of undefined
at Object.eval [as updateDirectives] (UpdateComponent.html:6)
at Object.debugUpdateDirectives [as updateDirectives] (core.js:11914)
at checkAndUpdateView (core.js:11307)
at callViewAction (core.js:11548)
at execComponentViewsAction (core.js:11490)
at checkAndUpdateView (core.js:11313)
at callViewAction (core.js:11548)
at execEmbeddedViewsAction (core.js:11511)
at checkAndUpdateView (core.js:11308)
at callViewAction (core.js:11548)
Мой update.component.html
файл:
<div>
<h2 class="page-header">Edit your Profile</h2>
<form (ngSubmit)="onUpdateSubmit(user)" novalidate>
<div class="form-group">
<label for="firstName">First Name</label>
<input type="text" [(ngModel)]="user.firstName" name="firstName" class="form-control" id="firstName" placeholder="First Name">
</div>
<div class="form-group">
<label for="lastName">Last Name</label>
<input type="text" [(ngModel)]="user.lastName" name="lastName" class="form-control" id="lastName" placeholder="Last Name">
</div>
<div class="form-group">
<label for="age">Age</label>
<input type="number" [(ngModel)]="user.age" name="age" class="form-control" id="age" placeholder="Age" min="0" max="200">
</div>
<div class="form-group">
<label for="favoriteFood">What is your Favorite Food?</label>
<input type="text" [(ngModel)]="user.favoriteFood" name="favoriteFood" class="form-control" id="favoriteFood" placeholder="Favorite Food">
</div>
<div class="form-group">
<label for="username">Username</label>
<input type="text" [(ngModel)]="user.username" name="username" class="form-control" id="username" placeholder="Username">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" [(ngModel)]="user.email" name="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" [(ngModel)]="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div><div>
<h2 class="page-header">Edit your Profile</h2>
<form (ngSubmit)="onUpdateSubmit(user)" novalidate>
<div class="form-group">
<label for="firstName">First Name</label>
<input type="text" [(ngModel)]="user.firstName" name="firstName" class="form-control" id="firstName" placeholder="First Name">
</div>
<div class="form-group">
<label for="lastName">Last Name</label>
<input type="text" [(ngModel)]="user.lastName" name="lastName" class="form-control" id="lastName" placeholder="Last Name">
</div>
<div class="form-group">
<label for="age">Age</label>
<input type="number" [(ngModel)]="user.age" name="age" class="form-control" id="age" placeholder="Age" min="0" max="200">
</div>
<div class="form-group">
<label for="favoriteFood">What is your Favorite Food?</label>
<input type="text" [(ngModel)]="user.favoriteFood" name="favoriteFood" class="form-control" id="favoriteFood" placeholder="Favorite Food">
</div>
<div class="form-group">
<label for="username">Username</label>
<input type="text" [(ngModel)]="user.username" name="username" class="form-control" id="username" placeholder="Username">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" [(ngModel)]="user.email" name="email" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" [(ngModel)]="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
Мой update.component.ts
файл:
import { Component, OnInit } from '@angular/core';
import { AuthService } from '../../services/auth.service';
import { ValidateService } from '../../services/validate.service';
import { Router } from "@angular/router";
import { FlashMessagesService } from 'angular2-flash-messages';
@Component({
selector: 'app-update',
templateUrl: './update.component.html',
styleUrls: ['./update.component.css']
})
export class UpdateComponent implements OnInit {
user: Object;
constructor(
private authService: AuthService,
private validateService: ValidateService,
private router: Router,
private _flashMessagesService: FlashMessagesService
) { }
ngOnInit() {
this.authService.getProfile().subscribe(profile => {
this.user = profile.user;
},
err => {
console.log(err);
return false;
});
}
onUpdateSubmit(user) {
console.log("Component", user)
// Required Fields
if(!this.validateService.validateSignup(user)) {
this._flashMessagesService.show("Please fill in all fields", {cssClass: "alert-danger", timeout: 3000});
return false;
}
// Validate Email
if(!this.validateService.validateEmail(user.email)) {
this._flashMessagesService.show("Please use valid email", {cssClass: "alert-danger", timeout: 3000});
return false;
}
// Update user
this.authService.updateUser(user).subscribe(data => {
if(data.success) {
this._flashMessagesService.show("Update Success!", {cssClass: "alert-success", timeout: 3000});
this.router.navigate(["/profile"]);
} else {
this._flashMessagesService.show("Something went wrong", {cssClass: "alert-danger", timeout: 3000});
this.router.navigate(["/update"]);
}
});
}
}