我无法处理从数据库中提取的数据。我想将它发送到中央服务,以便稍后在加载将使用数据的组件时使用它。 我的问题是,当我初始化依赖于此服务的组件时,中央服务似乎只接收数据。 结果:当组件加载时,数据还没有准备好,我得到了这种类型的错误:
错误类型错误:无法读取属性'性别'未定义的
以下是我的应用的结构:
-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) { }
答案 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);
}
}
这应该避免你得到的错误。