【问题标题】:Sharing Data between Components (Angular 7)在组件之间共享数据(Angular 7)
【发布时间】:2023-03-10 08:20:02
【问题描述】:

我目前正在尝试使用“BehaviorSubject”通过数据服务在组件之间发送数据。在第一个组件中,我正在更新 messageSoruce,在第二个组件中,我正在检索数据,但它是空的。我检查了值“this.card.img”不为空。我错过了什么?

数据服务

import { Injectable } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';


@Injectable()
export class DataService {

private messageSource = new BehaviorSubject("")
currentMessage = this.messageSource.asObservable();

constructor() { }

  changeMessage(message: string) {
  this.messageSource.next(message)
    }

 }

第一个组件

import {Component} from '@angular/core';
import {Router} from '@angular/router';
import {DataService} from 'src/app/services/data/data.service';


@Component({
  selector: 'app-card',
  templateUrl: './card.component.html',
  providers: [ DataService ],
  styleUrls: ['./card.component.css']
})


export class CardComponent {



  @Input('card') card:Card 


  constructor(public router: Router,
              public dataService :DataService ) {

  }

  openDetails() {

   this.dataService.changeMessage(this.card.img)
   this.router.navigateByUrl('/imganalyse');

  }

}

第二个组件

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

@Component({
  selector: 'app-imganalyse',
  templateUrl: './imganalyse.component.html',
  providers: [ DataService ],
  styleUrls: ['./imganalyse.component.css']
})



export class ImganalyseComponent implements OnInit {

  channel: string;

  constructor(private  youtubeService:YoutubeService,
              private dataService:DataService) { 

  }

  ngOnInit() {

  this.dataService.currentMessage.subscribe(channel => this.channel = channel)


  console.log(this.channel)

  }

}

【问题讨论】:

  • 您是否意识到在您的第二个组件中您尝试设置 this.channe 而不是 this.channel ?
  • 复制插入的时候出错了,值为this.channel
  • 有什么方法可以创建堆栈闪电战或粘贴 html 模板。我要说一件事,就风格而言,使用 Observables 时的 Angular 约定是以$ 结束变量名。因此,在您的 DataService 中,currentMessage 应该是 currentMessage$,除非您/您的组织不关心。
  • 提供者:[DataServie] 只需要在 app.module.ts 中设置,就可以只使用一个实例。

标签: angular data-binding angular7 behaviorsubject data-sharing


【解决方案1】:

解决办法:

提供者:[DataServie] 只需要在 app.module.ts 中设置为只使用一个实例。在我的情况下,每个组件都有自己的数据服务提供者,因此它有多个实例......(这就是它总是为空的原因)

【讨论】:

    【解决方案2】:

    首先,当您在组件提供程序中声明DataService 时,它会创建一个新实例。这意味着FirstComponent.dataService 指的是与SecondComponent.dataService 不同的对象。从组件装饰器中删除 'providers' 属性,并将 'providedIn' 添加到 DataService 装饰器以使其成为单例,因此所有引用都将引用同一个实例(除非您将它放在类的 'providers' 中):

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

    您正在订阅之外登录。当你调用它时:

    this.dataService.changeMessage(this.card.img)
    

    在您的第二个组件中,您在 OnInit 中有这个:

    this.dataService.currentMessage.subscribe(channel => this.channel = channel)
    console.log(this.channel)
    

    所以你订阅并且什么都不做,只是在频道改变时设置它,但是你的日志会立即发生,所以this.channel 还不会被设置。我不知道什么叫openDetails(),但在你的第二个组件中试试这个:

    this.dataService.currentMessage.subscribe(channel => {
      this.channel = channel;
      console.log('updated channel:', channel);
    });
    
    
    
    

    【讨论】:

    • 这就像 Angular 6+ 对吧? angular 5 你是怎么做到的?
    • 将服务放在主模块中的提供程序中,而不是其他任何地方,您应该只有一个实例。
    猜你喜欢
    • 2020-03-14
    • 2019-08-04
    • 2018-09-27
    • 2018-10-12
    • 2019-08-05
    • 2018-02-17
    • 2021-01-04
    • 2019-01-22
    相关资源
    最近更新 更多