#angular #variables #dependencies #components
#angular #переменные #зависимости #Компоненты
Вопрос:
В настоящее время я работаю над школьным проектом, и моя программа почти полностью функционирует. Проблема в том, что я не могу понять, как передать собранные пользовательские данные из одного компонента в следующий компонент, чтобы отобразить их на странице профиля. Я пробовал некоторые вещи с @Input () и тому подобное, но чувствую, что мне лучше спросить здесь и действительно чему-то научиться, чем делать это правильно на основе предположения.
login( username, password ) {
//returns succes/error
//return data
console.log(username, password)
const url = `https://svsdb.woodl.nl:5555/api/public/auth/login`;
const data = {
email: username,
password: password,
}
console.log(data)
this.httpClient.post(url, data).subscribe(
(res:any)=>{
console.log(res)
console.log(res.message)
this.token = res.data.token.value
this.readUser(res.data.user._id)
this.key = res.message
},
(error)=>console.log(error),
()=>console.log(),
)
}
readUser(userId) {
const url = `https://svsdb.woodl.nl:5555/api/user/read/${userId}`;
const options = {
headers: {
authorization: this.token,
}
}
this.httpClient.get(url, options).subscribe(
(res:any)=>{
console.log(res)
const user_data = res
console.log(this.key)
this.redirect(this.key)
},
(error)=>{
},
()=>{
}
)
}
Эти две функции являются частью LoginComponent, данные, которые я хочу передать в свой ProfileComponent, — это ‘user_data’, которые я извлекаю во второй функции.
import { Component, OnInit, Input } from '@angular/core';
import { LoginComponent } from '../login/login.component';
@Component({
selector: 'app-profile',
templateUrl: './profile.component.html',
styleUrls: ['./profile.component.css'],
providers: [ LoginComponent ]
})
export class ProfileComponent implements OnInit {
constructor(
private loginComponent: LoginComponent
) { }
ngOnInit() {
const user_data = this.loginComponent.user_data;
}
}
Это весь мой файл profilecomponent.ts, как вы можете видеть, я пытался получить пользовательские данные, но это не работает, я очень новичок во всем этом, и это последний шаг к завершению моего задания, поэтому любая помощь была бы очень признательна.
Комментарии:
1. возможно, это вам поможет: angularfirebase.com/lessons /…
2. в принципе, поскольку вы пытаетесь обмениваться данными из одного представления в другое, вам нужно место для их хранения. как упоминает MarkB ниже, вы могли бы создать сервис для этого.
3. вы также могли бы спрятать ее в
localStorage
Ответ №1:
Мне нравится использовать rxjs ‘ behaviorsubject для выполнения таких действий, как отображение другим компонентом информации, вызванной из другого. Я рекомендую получать данные в сервисе. Вызовите функцию в этой службе из одного компонента и отобразите в другом. Вот пример выполнения поиска из компонента navbar, запуска функции в службе для получения данных, и данные отображаются в компоненте view.
Файл service.ts:
import { Injectable } from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {BehaviorSubject} from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private _data = new BehaviorSubject (null);
constructor(private http: HttpClient, private messageService : MessageService) { }
getData(page:number){
return this.http.get("https://jsonplaceholder.typicode.com/todos/" page)
.subscribe(data => this._data.next(data));
}
get data$() {
return this._data.asObservable();
}
}
Именно в этом компоненте я вызываю функцию получения данных, здесь это был мой компонент navbar:
import { Component, OnInit } from '@angular/core';
import {DataService} from '../data.service';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css']
})
export class NavbarComponent implements OnInit {
constructor(private dataService: DataService) { }
page:number;
search(page){
this.dataService.getData(page);
}
ngOnInit() {
}
}
Затем данные отображаются в компоненте просмотра:
import { Component, OnDestroy, OnInit } from '@angular/core';
import {DataService} from '../data.service';
import * as Rx from "rxjs";
@Component({
selector: 'app-view',
templateUrl: './view.component.html',
styleUrls: ['./view.component.css']
})
export class ViewComponent implements OnDestroy, OnInit {
sub: Rx.Subscription;
info:{};
constructor(private dataService: DataService) {}
ngOnInit(){
this.sub = this.dataService.data$.subscribe(data=>this.info=data);
}
ngOnDestroy () {
this.sub.unsubscribe();
}
}
Дает ли это вам какие-либо идеи, которые можно попробовать в вашем приложении?