【问题标题】:What is the best way for me to push data to a component from a service?我将数据从服务推送到组件的最佳方式是什么?
【发布时间】:2018-07-01 09:27:26
【问题描述】:

在我的 Angular 项目中,我目前有一个使用 http 调用从我的 java 代码中检索数据的服务。服务每 10 秒调用一次 Java 端并从中获取新数据。我现在有另一个组件需要我的服务中的数据。我需要这个组件有一个名为“数据”的字段,当服务获取新信息时它会自动更新。

如何设置它们以便服务将新信息推送到我的其他组件?我希望能够在我的组件的 html 中使用 {{data}} 并使其自动更新而无需重新加载页面。

我的组件已经包含“Autowired”服务。所以目前我可以调用 'this.data = this.service.getData()' 但该调用在我的 ngOnInit 方法中,所以它只发生一次,并且当服务的数据字段更新时,数据字段不会更新。

【问题讨论】:

标签: javascript html angular service observable


【解决方案1】:

您可以创建一个为订阅者发布数据的消息服务或在您的原始服务中实现此功能。

我建议有一个单独的消息服务,并让相关组件或服务发布/订阅它。

messaging.service.ts

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


@Injectable()
export class MessagingService {
  private sharedValue = new Subject<string>();  

  // Observable string streams
  sharedValue$ = this.sharedValue.asObservable();

    // Service message commands
  publishData(data: string) {
    this.sharedValue.next(data);
  }

你会像这样注入服务:

constructor(private messagingService: MessagingService ) {}

发布到服务:

this.messagingService.publishData(sharedValue);

订阅服务:

this.messagingService.sharedValue$.subscribe(
            data => {                    
                this.localSharedValue = data;
            });

来自下面的答案:DeborahK(每个人都应该观看的 Pluralsight 课程)

实际上,您只需要一个 getter。

将您的“数据”属性更改为 getter,这样就可以解决问题:

get data(): any {
    return this.service.getData();
}

角度变化检测将检测到任何时间数据发生变化 将导致它重新评估其绑定并调用的服务 这个 getter 重新获取数据。

不需要花哨的服务或主题。 :-)

【讨论】:

  • 这正是我的想法,但不知道如何执行,谢谢!所以我在使用这个之后遇到了一个有趣的问题。我正在使用它从 Java 获取客户端列表。当我使用此方法时,它会正确检索客户端,并在它们发生变化时更新它们(哇!)但是,当我抓住客户端并将我的字段设置为数据时,我尝试调用另一个使用客户端列表的方法该方法仍然未定义。只有当我将数据传递给方法而不是使用 this.clients 时,它才有效。有没有办法来解决这个问题?谢谢!
  • @skyleguy 请在不同的问题中发布您的代码,因为它可能是很多不同的东西。没有看到代码很难说。一种可能性是您在 subscribe() 方法之外调用您的方法。
【解决方案2】:

实际上,您只需要一个 getter。

将您的“数据”属性更改为 getter,这样就可以解决问题:

get data(): any {
    return this.service.getData();
}

Angular 更改检测将检测服务中数据发生更改的任何时间,这将导致它重新评估其绑定并调用此 getter 以重新获取数据。

不需要花哨的服务或Subject。 :-)

【讨论】:

  • 我相信这是我首先尝试做的,但它没有奏效......我一定没有正确地做某事。下次出现这个问题时,我一定会尝试这个,因为它肯定更简单,耗时更少。还必须阅读更改检测。谢谢!
  • @DeborahK 我喜欢你的课程。这种方法的一个缺点是它是“自动神奇的”,没有明确说明数据是如何被推送或更新的。的确,这是一个很棒且节省时间的功能,但我总是犹豫要添加没有明确说明它在做什么的代码。
  • 谢谢!正如他们所说:“任何足够先进的技术都与魔法无异”哈哈。你使用数据绑定吗? Getter 使用与数据绑定相同的“神奇”方法。您对 getter 与属性声明所做的所有事情都是允许它每次都获取最新版本的值。
  • 数据绑定是明确的(即大多数开发人员希望它们绑定)。 getter 是一种访问器方法,它返回私有成员变量的值(大多数开发人员不会假设它正在推送/更新数据)。我不得不承认,我对 Angular 的大部分知识都来自你的课程,所以我在这个讨论中有点不合群:)
  • 不,getter 不会推送/更新数据。它们是只是属性声明,其中包含一些代码。他们没有做任何特别的事情。当 Angular 的更改检测检测到某些内容发生了更改时,它会重新绑定并获取当前属性值。我们添加的只是在绑定发生时调用其他代码(我们服务中的属性)的能力。这里没有魔法。我正在学习的当前课程详细介绍了这一点。它被称为“Angular 组件通信”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多