【问题标题】:Passing Data from Service to Component将数据从服务传递到组件
【发布时间】:2017-05-06 04:51:23
【问题描述】:

在有人将此标记为重复之前以下是我尝试过但失败的链接

Angular 2 - passing data from service to component

How to subscribe to an event on a service in Angular2?

场景 我想将数据从我的 ng2 服务发送到组件,并且正在使用 ng2 HTTP 从 API 加载数据

下面是伪代码

我的服务

@Output() event_callback: EventEmitter<any> = new EventEmitter();

getUserDetails(id)
{
    var user_data;
    this.loadRemoteUrl('getUserdata?user_id=' + id).subscribe(
        data => { user_data = data},
        err => console.error(err),
        () => {
            console.log('Inside My Service');
            this.user_data = user_data;
            this.event_callback.emit(this.user_data);
        }
    );
}

我的组件

constructor(private http:Http, private myService: MyService) 
{
    var userDetails;
    myService.event_callback.subscribe(
        data => this.callbackFunction()
    );
}

callbackFunction()
{
    console.log("Inside MyComponent")
}

控制台日志

Inside My Service

HTTP 请求正在正确返回数据,我在发出之前尝试转储它并且它工作但问题是我无法访问我的组件中的数据,我尝试传递数据,现在我只是一些记录消息来识别流但仍然无法从我的组件文件中查看日志消息。

我错过了什么?

【问题讨论】:

  • 你能确保你的组件在调用 getUserDetails 之前订阅了服务吗?
  • 你在哪里打电话getUserDetails?来自另一个组件?另请注意,您不需要在服务上添加@Output 注释
  • 它被组件的另一个方法调用... @rob
  • @Milad 是的,我确信当调用 getUserDetails() 方法时组件会订阅...

标签: angular angular2-services angular2-components


【解决方案1】:

在您的情况下,我建议使用可观察的主题而不是 @Output。

在您的服务中,插入:

@Output() event_callback: EventEmitter<any> = new EventEmitter();

创建新的可观察源和流(记得从“rxjs/Subject”导入主题):

private eventCallback = new Subject<string>(); // Source
eventCallback$ = this.eventCallback.asObservable(); // Stream

安装于:

this.event_callback.emit(this.user_data);

发送消息:

this.eventCallback.next(this.user_data);

然后,在您的组件中:

myService.eventCallback$.subscribe(data => {
    this.callbackFunction();
});

见:working example on Plunker

阅读有关此解决方案的更多信息: Angular.io - Communicate via a service

【讨论】:

  • 我已经试过了,但没有用,但据我所知,它们的工作方式相同,emit 是最新的 Angular,而 next 是旧版本,谢谢努力...
  • @AkshayKhale 我在 plunker 上添加了工作示例,请查看:plnkr.co/edit/Hhc6lTSwGQWP3zq2Ttlu?p=preview
  • @jarek 谢谢你的 plunkr 帮了我很多忙!一个小问题。私人事件回调:Subject = new Subject();应该是私有事件回调:Subject = new Subject();如果您只想传递一个字符串,删除了数组语法
猜你喜欢
  • 2018-06-30
  • 2019-05-26
  • 2018-07-08
  • 2017-07-21
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 2018-01-09
相关资源
最近更新 更多