微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用为使用服务的其他组件提供数据

如何解决无法使用为使用服务的其他组件提供数据

我创建了两个组件,一个用于列出所有贷款,另一个用于通过点击列表中的每张卡查看每笔贷款的详细信息。当我尝试在 subscribe 中控制台数据时,我可以查看信息,但是在 HTML 页面上我没有得到任何数据。

loan.ts

export class Loan
{
    id :number;
    title: string;
    description: string;
    amount: number;
}

list-loan-component.ts

import { Component,OnInit } from '@angular/core';
import * as EventEmitter from 'events';
import { Loan } from '../loan';
import { LoanService } from '../loan.service';

@Component({
  selector: 'app-list-loans',templateUrl: './list-loans.component.html',styleUrls: ['./list-loans.component.css']
})
export class ListLoansComponent implements OnInit {
  
  loans:Loan[];

  constructor(private loanService: LoanService) { }

  ngOnInit(): void {
    this.loans = this.loanService.getLoans();
  }

  openLoan(loan: Loan)
  {
    this.loanService.loan.emit(loan);   
  }
}

list-loans-component.html

<div class="container">
    <div class="card-deck">
       <div *ngFor="let loan of loans">
           <div class="card" routerLink="/loan/view" routerLinkActive="active"
           (click)="openLoan(loan)">
               <div class="card-header"> {{loan.title}} - {{loan.amount}}</div>
               <div class="card-body">
                   <p class="card-text">{{loan.description}}</p>
               </div>
           </div>
       </div>
    </div>
</div>

view-loan.component.ts

import { ChangeDetectorRef,Component,Input,OnChanges,OnInit } from '@angular/core';
import { ActivatedRoute,ActivatedRouteSnapshot,Params } from '@angular/router';
import { Loan } from '../loan';
import { LoanService } from '../loan.service';

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

  selectedLoan: Loan ;

  constructor(private loanService: LoanService,private router:ActivatedRoute) { }

  ngOnInit() {
    this.loanService.loan.subscribe(loan =>
      {
        this.selectedLoan = loan;     
      }
    );
  }
}

view-loan.component.html

<div class="card text-center">
  <div class="card-header">
    {{selectedLoan['title']}}
  </div>
  <div class="card-body">
    <h5 class="card-title">Loan From :  {{selectedLoan['title']}}</h5>
    <h3 style="text-align: left; text-decoration: underline;">Details:</h3>
    <p class="card-text">{{selectedLoan['description']}}</p>
    <p class="card-text">{{selectedLoan['amount']}}</p>
    <a href="#" class="btn btn-primary">Go somewhere</a>
  </div>
  <div class="card-footer text-muted">
    2 days ago
  </div>
</div>

loan.service.ts

import { Injectable,Output,EventEmitter } from "@angular/core";
import { Loan } from "./loan";
    
@Injectable({
    providedIn: 'root'
  })
export class LoanService
{
    loan = new EventEmitter<Loan>();

    private loans:Loan[] = [
        {
            "id":1,"title" : "HDFC Credit Loan","description" :"Loan to clear all credit card payments","amount" : 24958.23
        },{
            "id":2,"title" : "Aditya birla personal Loan","description" :"Loan to personal expenses","amount" : 12000.00
        }
    ]

    constructor(){}

    getLoans(): Loan[]{
        return this.loans.slice()
    }

    getLoan(id:number): Loan{
        this.loans.forEach(loan =>
            {
                if(loan["id"] === id) 
                    return loan;
            }
        );
        return new Loan();
    }
}

注意:我也在使用路由。请让我知道路由是否会导致任何此类问题。

解决方法

似乎在加载 ViewLoanComponent 之前传递了 EventEmitter 值。只需将您的 EventEmitter 替换为 ReplaySubject,如下所示:

export class LoanService
{
    $loan = new ReplaySubject<Loan>(1);
...

接下来是代码

openLoan(loan: Loan)
  {
    this.loanService.$loan.next(loan);   
  }

还删除异步管道,在您的情况下:

<div *ngFor="let loan of loans">
,

在您的 list-loans-component.html 中,您正在像这样迭代您的贷款:

<div *ngFor="let loan of loans | async"> 但您的 loans 不是 async 值,因为您的 loan 服务直接返回 Loan[](不是 Observable<Loan[]>)。 只需移除 async 管道,事情就会开始工作。

附言 很好的问题。

编辑:

这是一个有效的 stackblitz 代码行。

,

您可以在 observable 上使用 async 管道,但在您的代码中,您使用的是贷款 [] 女巫是一个数组。

移除管道。

但我建议使用 BehaviorSubjectObservable 而不是 EventEmitterhttps://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?