与服务共享数据

时间:2018-09-10 17:33:09

标签: javascript angular typescript

我正在尝试显示每个对应名称的数据(来自json服务器的数据),例如firstName,lastName,email等。

user.component.html -这是我要显示相应数据的地方

<div>
  <h2>{{selectedUser.firstName | uppercase}} Details</h2>
  <div><span>id: </span>{{selectedUser.id}}</div>
  <div>
    <label>First name:
      <input [(ngModel)]="selectedUser.firstName" placeholder="First Name" />
    </label>
  </div>
  <div>
    <label>Last name:
      <input [(ngModel)]="selectedUser.lastName" placeholder="Last Name" />
    </label>
  </div>
  <div>
    <label>Email:
      <input [(ngModel)]="selectedUser.email" placeholder="example.com" />
    </label>
  </div>
  <div>
    <label>Start date:
      <input [(ngModel)]="selectedUser.startDate" placeholder="Start date" />
    </label>
  </div>
</div>

user.component.ts

import { Component, OnInit, Input } from '@angular/core';
import { User } from '../user';
import { DataService } from '../data.service';

@Component({
  selector: 'app-user',
  templateUrl: './user.component.html',
  styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {

  users: any

  constructor(private dataService: DataService) { }

  ngOnInit() {
    this.dataService.getUsers()
      .subscribe(data => this.users = data);
  }
}

home.component.html -在此处显示每个用户的名称,单击时要在用户页面上显示内容

<h2>Users</h2>
<ul class="users">
  <a routerLink="/user"><li *ngFor="let user of users['users']"
    [class.selected]="user === selectedUser"
    (click)="onSelect(user)">
    <span class="badge">{{user.id}}</span> {{user.firstName}} {{user.lastName}}
  </li> </a>
</ul>

home.component.ts

import { Component, OnInit } from '@angular/core';
import { DataService } from '../data.service';
import { Router } from '@angular/router';
import { User } from '../user';


@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

  public users = [];

  constructor(private dataService: DataService) { }

  ngOnInit() {
    this.dataService.getUsers()
      .subscribe(data => this.users = data);

  }
}

这是 data.service

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject } from 'rxjs';
import { Observable } from 'rxjs';
import { User } from "./user";

@Injectable({
  providedIn: 'root'
})
export class DataService {

  selectedUser: User;

  constructor(private http: HttpClient) {}

  getUsers(): Observable<User[]>{
    return this.http.get<User[]>("http://localhost:3000/users");
  }      

  onSelect(user: User): void {
    console.log(user);
    this.selectedUser = user;
  }
}

当我在首页上显示名称时,它就起作用了。 我还在单个页面(home.component)上进行了这种数据显示,并且它可以工作,但是现在我必须在另一页面上显示它。我曾尝试通过BehaviourSubject来做到这一点,但被困住了。

2 个答案:

答案 0 :(得分:1)

您错误地访问了.html文件中的属性。示例:

<h2>Users</h2>
<ul class="users">
  <a routerLink="/user"><li *ngFor="let user of users['users']"
    [class.selected]="user === selectedUser"
    (click)="onSelect(user)">
    <span class="badge">{{user.id}}</span> {{user.firstName}} {{user.lastName}}
  </li> </a>
</ul>

应该是:

<h2>Users</h2>
<ul class="users">
  <a routerLink="/user"><li *ngFor="let user of users['users']"
    [class.selected]="user === dataService.selectedUser"
    (click)="dataService.onSelect(user)">
    <span class="badge">{{user.id}}</span> {{user.firstName}} {{user.lastName}}
  </li> </a>
</ul>

答案 1 :(得分:0)

您可以让DataServiceusers中为您缓存BehaviorSubject,所有组件都绑定到DataService的users$属性。

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { HttpClient, HttpResponse, HttpErrorResponse } from '@angular/common/http';
import { User } from "./user";

@Injectable({
  providedIn: 'root'
})
export class DataService {

  isLoading$ = new BehaviorSubject<boolean>(false);
  users$ = new BehaviorSubject<User[]>(undefined);

  constructor(private http: HttpClient) { }

  loadUsers(): void {
    this.isLoading$.next(true);    

    this.http.get<User[]>("http://localhost:3000/users", { observe: "response" }).subscribe(
      (res: HttpResponse<User[]>) => {
        this.users$.next(res.body);
      },
      (res: HttpErrorResponse) => this.onError(res),
      () => this.isLoading$.next(false)
    );    
  }

  private onError(res: HttpErrorResponse) {
    console.log(res.message);
  }
}