【问题标题】:Sending data to components through services using the subject in Angular使用 Angular 中的主题通过服务向组件发送数据
【发布时间】:2021-04-23 17:00:05
【问题描述】:

我有一个组件显示几秒钟的消息,我的问题是我无法订阅服务并执行必要的操作,怎么办?

这是一个简短的例子,我想在项目的所有阶段调用消息组件,我该怎么做?

homeComponent.ts:

    export class HomeComponent  {
      constractor(privat _service:IHomeService){}
      getMessage(){
        this._service.get();
      }
    }

homeComponent.html:

<p (click)="getMessage()">
 show Message 
</p>

homeService.ts:

@Injectable()
export class HomeService {
  openMessage=new Subject<string>();
  get() {
    setTimeout(()=>{
      this.openMessage.next("test")
    },1000)
  }
}

messageComponent.ts:

export class MessageComponent  {
  constructor(private _service:HomeService){
    this._service.openMessage.subscribe((res)=>{
      this.name=res;
      this.flag=true;
      setTimeout(()=>{
        this.flag=false;
      },4000)
    })
  }
  name = '';
  flag:boolean=false
}

messageComponent.html:

<p [ngStyle]="flag?'display:block':'display:none'">
  {{name}}
</p>

我认为这不会发生,因为未加载消息组件 如何将其加载到服务中?

【问题讨论】:

  • messageComponent 的选择器包含在哪里?类似&lt;app-message&gt;&lt;/app-message&gt;
  • 我不想在任何地方包含它,我想在服务中加载,因为它是针对整个项目而不是特定部分的
  • 检查SubjectBehaviourSubjectlink 的区别。您可能需要将Subject 替换为BehaviourSubject

标签: angular angular-observable


【解决方案1】:

你在哪里加载 messageComponent?

homeComponent.html:
    <p (click)="getMessage()">
     show Message  // if you loading message component here then you should use message component's selector here
    </p> 

【讨论】:

    【解决方案2】:

    您不会“加载”服务中的组件,Angular 存储逻辑中的服务,它们不会消耗组件。

    如果MessageComponent 负责在 UI 中显示消息,那么您只需在模板中使用它即可。假设它的选择器是message-component,您可以将其添加到您的HomeComponent 模板中:

    <p (click)="getMessage()">
     <message-component></message-component>
    </p>
    

    【讨论】:

    • 这是一个小例子,我在很多地方都使用它,我在导入的任何地方都做不到,服务中的碘,怎么做?
    • 抱歉,我不清楚您的问题是什么。重用组件是为特定的 UI 片段拥有一个组件的关键。同样,您不能在服务中“加载”组件。如果这是您的问题,您可以在 UI 中动态加载组件,而不是在模板中使用选择器。我建议你添加更多关于你想要完成的细节。
    【解决方案3】:

    您的服务中缺少 Observable 变量。这是你应该怎么做的:

    import { Injectable } from '@angular/core';
    import { Subject } from 'rxjs';
    
    @Injectable()
    export class HomeService {
      private openMessage: Subject<string> = new Subject<string>();
      public $openMessage: Observable<string> = this.openMessage.asObservable();
    
      public sendMessage(message: string) {
        this.openMessage.next(message);
      }
    }
    

    然后您将能够调用subscribe() 方法到您的类中声明的$openMessage 变量。以下是如何更新您的MessageComponent.ts

    export class MessageComponent {
      public name: string = '';
      public flag: boolean = false;
    
      constructor(private _service:HomeService){
        this._service.$openMessage.subscribe((message)=>{
          this.message = res;
          this.flag = true;
          setTimeout(()=>{
            this.flag=false;
          },4000)
        })
      }
    }
    

    【讨论】:

    • Subjects 是 Observables,您可以订阅它们,它们公开了一个 subscribe() 方法。您在这里所做的当然是一个很好的做法,以便封装 emit 新值的能力,但与 subscribe 的能力无关
    • 不行,我试过了,还是不行,因为必须先导入,在服务中这个导入怎么办?
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2014-11-20
    • 2016-07-24
    • 2013-11-17
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多