Javascript 对于我来说,将数据从服务推送到组件的最佳方式是什么?

Javascript 对于我来说,将数据从服务推送到组件的最佳方式是什么?,javascript,html,angular,service,observable,Javascript,Html,Angular,Service,Observable,在我的angular项目中,我目前有一个使用http调用从java代码检索数据的服务。每10秒,服务调用Java端并从中获取新数据。我现在有另一个组件需要我的服务中的数据。我需要这个组件有一个名为“data”的字段,当服务获得新信息时,该字段会自动更新 我如何设置它们,以便服务将新信息推送到我的其他组件?我希望能够在我的组件的html中使用{{data}},并使其自动更新,而无需重新加载页面 我的组件中已经有了“自动连线”服务。因此,目前我可以只调用'this.data=this.service

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

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


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

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

我建议使用单独的消息服务,并让相关组件或服务发布/订阅该服务

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);
  }
发布到服务:

this.messagingService.publishData(sharedValue);
this.messagingService.sharedValue$.subscribe(
            data => {                    
                this.localSharedValue = data;
            });
订阅服务:

this.messagingService.publishData(sharedValue);
this.messagingService.sharedValue$.subscribe(
            data => {                    
                this.localSharedValue = data;
            });
下面的答案是:DeborahK(每个人都应该看谁的Pluralsight课程)


事实上,你需要的只是一个干劲

将“数据”属性更改为getter,这将实现以下功能:

get data(): any {
    return this.service.getData();
}
get data(): any {
    return this.service.getData();
}
角度变化检测将检测任何时间内数据的变化 将导致它重新评估其绑定并调用 此getter用于重新获取数据

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


事实上,你需要的只是一个干劲

将“数据”属性更改为getter,这将实现以下功能:

get data(): any {
    return this.service.getData();
}
get data(): any {
    return this.service.getData();
}
角度变化检测将检测服务中数据的任何变化,这将导致服务重新评估其绑定并调用此getter重新获取数据


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

我相信这是我第一次尝试做的事情,但没有成功。。。我一定做得不对。下一次出现这个问题时,我一定会尝试这个方法,因为它肯定更简单、更省时。还必须读取更改检测。谢谢@黛博拉:我喜欢你的课程。这种方法的一个缺点是它是“自动魔法”,没有明确说明数据是如何被推送或更新的。诚然,这是一个伟大的和节省时间的功能,但我总是犹豫添加代码,不明确它在做什么。谢谢!正如他们所说:“任何足够先进的技术都无法与魔法区分开来”哈哈。你使用数据绑定吗?getter使用与数据绑定相同的“神奇”方法。与属性声明相比,getter所做的只是允许它每次都获取最新版本的值。数据绑定是显式的(即大多数开发人员希望它们绑定)。getter是一种访问器方法,它返回私有成员变量的值(大多数开发人员不会假设它将推送/更新数据)。我必须承认,我对Angular的大部分知识都来自你们的课程,所以我在这次讨论中有点力不从心:)不,Getter不会推送/更新数据。它们只是带有一些代码的属性声明。他们没有做什么特别的事。当Angular的更改检测检测到某些内容已更改时,它将重新绑定并获取当前属性值。我们添加的只是在绑定发生时调用其他代码(服务中的属性)的能力。这里没有魔法。我目前正在学习的课程详细介绍了这一点。这就是所谓的“角度组件通信”。这正是我的想法,但不知道如何执行它,谢谢!所以我在使用这个之后遇到了一个有趣的问题。我使用它从Java获取客户机列表。当我使用这个方法时,它会正确地检索客户机,并在客户机发生变化时进行更新(哇!)。然而,当我抓取客户机并将字段设置为数据时,我会尝试调用另一个使用客户机列表的方法,而在该方法中它仍然是未定义的。只有当我将数据传递到方法中而不是使用this.clients时,它才起作用。有办法解决这个问题吗?谢谢@skyleguy请在不同的问题中发布您的代码,因为它可能有很多不同的东西。如果看不到代码,很难判断。一种可能性是在subscribe()方法之外调用方法。