订阅事件仅在加载组件时有效

时间:2017-10-26 09:35:47

标签: angular http events

我无法处理从数据库中提取的数据。我想将它发送到中央服务,以便稍后在加载将使用数据的组件时使用它。 我的问题是,当我初始化依赖于此服务的组件时,中央服务似乎只接收数据。 结果:当组件加载时,数据还没有准备好,我得到了这种类型的错误:

错误类型错误:无法读取属性'性别'未定义的

以下是我的应用的结构:

-a dataStorage服务处理http请求

- 存储所有数据的中央服务(在这种情况下,是一个对象数组)。

- 放在"共享"夹

- 从中​​央服务

获取数据的各种组件(延迟加载)

- 初始化应用时发送http请求

这是数据存储服务。当发出http请求时,我通过构造函数

中的事件发送数据
@Injectable()
export class DataStorageService {
    constructor(private http:Http,private authService:AuthService){
      this.getStoredCatList().subscribe(
      (response:Response)=> {
             const data = response.json();
             this.dataFetched.emit(data);
        },
      (error:Error)=>console.log(error)
      );
  }

dataFetched = new EventEmitter<Cat[]>();


    getStoredCatList(){
        return this.http.get('https://adopt-meow.firebaseio.com/data.json');

    }
}

这是我订阅活动的中心服务。

@Injectable()
export class CatListService implements OnInit{

    constructor(private dataStorageService:DataStorageService){
        this.dataStorageService.dataFetched.subscribe(
            (catList:Cat[])=>this.catList = catList,
            console.log("event received by catList service"))
        }

根据我对Angular的理解,我想我应该得到消息&#34;事件由catList服务&#34;一旦事件发出。那么为什么我只在加载组件时才能得到它?

EDIT 对于那些有兴趣跟进此事的人,我设法通过在应用程序启动时在app.component.ts中导入服务来找到解决方案。

constructor(private dataStorageService: DataStorageService, 
    private catListService:CatListService) { }

3 个答案:

答案 0 :(得分:1)

Services仅在Component或任何其他Service内注入时初始化。我相信您已在组件中注入了CatListService。此外,subscription构造函数中的CatListService只有在加载服务后才会处于活动状态。这就是您在组件加载之前没有收到数据的原因。

注意:在模块级别或组件级别提供Service将不会调用Service构造函数。只有在Component或任何其他Service构造函数中注入它们时才会调用它们。

答案 1 :(得分:0)

ngOnInit()使用指令和组件而不是服务,您可以在组件内订阅您的服务,您可以创建一个init方法并在服务的构造函数内调用它

答案 2 :(得分:0)

当您尝试在模板中显示数据时,听起来似乎尚未加载数据。

您可以尝试添加显示数据的<span>{{ genders | async }}</span> 管道。

public static void clearConsole() {
        String value = "\n\r";
        for (int i = 0; i < 5; ++i) {
            value = value + value;
            System.out.printf(value);
        }
    }

这应该避免你得到的错误。