angular8中如何在不破坏组件数据的情况下添加导航?
How to add navigation without destroying component data in angular 8?
我正在设置一个包含三个组件的新应用程序。第一个是表单,提交它我将数据存储在单例服务中,然后导航到第二个组件。单击第二个组件上的按钮,我导航到第三个组件,其中应显示表单中提交的数据。但是这些数据在导航过程中会被破坏,即使我跳过第二个组件也是如此。
当两个组件都显示在页面上时,通过字符串插值正常打印数据。
我认为该服务是单例且处于 app.component 级别,即使在组件销毁后也应该存储这些数据,但事实并非如此。
所以我的问题是,有没有办法在第一次组件销毁后保存数据?
我将表单组件、服务和输出组件的 .ts 文件附加到中间组件。
Form.component.ts:
import { Component, OnInit, ViewChild, } from '@angular/core';
import { userDataService } from '../shared/user-data.service';
import { NgForm } from '@angular/forms';
import { User } from '../shared/user.model';
import { Router } from '@angular/router';
@Component({
selector: 'app-home-form',
templateUrl: './home-form.component.html',
styleUrls: ['./home-form.component.css']
})
export class HomeFormComponent implements OnInit {
@ViewChild('myForm', { static: false }) userForm: NgForm;
constructor(private userData: userDataService,
private router: Router) {}
ngOnInit() {
}
onSubmit(){
const newUser = new User(this.userForm.value['name'], this.userForm.value['surname'], this.userForm.value['gender'], this.userForm.value['email']);
this.userData.addUser(newUser);
this.userForm.reset();
this.router.navigate(['/user']);
}
}
用户-data.service.ts
import { User } from './user.model';
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({providedIn: 'root'})
export class userDataService {
private myUser = new Subject<User>();
myUserObservable = this.myUser.asObservable();
addUser(user: User){
this.myUser.next(user);
}
}
用户-profile.component.ts
import { Component, OnInit } from '@angular/core';
import { userDataService } from '../shared/user-data.service';
import { User } from '../shared/user.model';
@Component({
selector: 'app-user-profile',
templateUrl: './user-profile.component.html',
styleUrls: ['./user-profile.component.css'],
})
export class UserProfileComponent implements OnInit {
user: User = {
name: '',
surname: '',
gender: '',
email: ''
}
constructor(private userData: userDataService) {}
ngOnInit() {
this.userData.myUserObservable.subscribe(
(user: User) => {
this.user = user;
}
);
}
}
首先,数据没有被破坏,
这就是 Subject
的工作原理,在您的情况下,您可以使用 BehaviorSubject
所以从 :
private myUser = new Subject();
收件人:
private myUser = new BehaviorSubject(null);
For testing open user.service.ts
Try both method one by one private myUser = new Subject();
private myUser = new BehaviorSubject(null);
For More Detail :
我正在设置一个包含三个组件的新应用程序。第一个是表单,提交它我将数据存储在单例服务中,然后导航到第二个组件。单击第二个组件上的按钮,我导航到第三个组件,其中应显示表单中提交的数据。但是这些数据在导航过程中会被破坏,即使我跳过第二个组件也是如此。 当两个组件都显示在页面上时,通过字符串插值正常打印数据。 我认为该服务是单例且处于 app.component 级别,即使在组件销毁后也应该存储这些数据,但事实并非如此。
所以我的问题是,有没有办法在第一次组件销毁后保存数据?
我将表单组件、服务和输出组件的 .ts 文件附加到中间组件。
Form.component.ts:
import { Component, OnInit, ViewChild, } from '@angular/core';
import { userDataService } from '../shared/user-data.service';
import { NgForm } from '@angular/forms';
import { User } from '../shared/user.model';
import { Router } from '@angular/router';
@Component({
selector: 'app-home-form',
templateUrl: './home-form.component.html',
styleUrls: ['./home-form.component.css']
})
export class HomeFormComponent implements OnInit {
@ViewChild('myForm', { static: false }) userForm: NgForm;
constructor(private userData: userDataService,
private router: Router) {}
ngOnInit() {
}
onSubmit(){
const newUser = new User(this.userForm.value['name'], this.userForm.value['surname'], this.userForm.value['gender'], this.userForm.value['email']);
this.userData.addUser(newUser);
this.userForm.reset();
this.router.navigate(['/user']);
}
}
用户-data.service.ts
import { User } from './user.model';
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({providedIn: 'root'})
export class userDataService {
private myUser = new Subject<User>();
myUserObservable = this.myUser.asObservable();
addUser(user: User){
this.myUser.next(user);
}
}
用户-profile.component.ts
import { Component, OnInit } from '@angular/core';
import { userDataService } from '../shared/user-data.service';
import { User } from '../shared/user.model';
@Component({
selector: 'app-user-profile',
templateUrl: './user-profile.component.html',
styleUrls: ['./user-profile.component.css'],
})
export class UserProfileComponent implements OnInit {
user: User = {
name: '',
surname: '',
gender: '',
email: ''
}
constructor(private userData: userDataService) {}
ngOnInit() {
this.userData.myUserObservable.subscribe(
(user: User) => {
this.user = user;
}
);
}
}
首先,数据没有被破坏,
这就是 Subject
的工作原理,在您的情况下,您可以使用 BehaviorSubject
所以从 :
private myUser = new Subject();
收件人:
private myUser = new BehaviorSubject(null);
For testing open
user.service.ts
Try both method one by one private myUser = new Subject(); private myUser = new BehaviorSubject(null);
For More Detail :