Angular中TodoService的ngOnInit方法未触发问题求助
解决TodoService中ngOnInit未触发的问题
嘿,这问题我之前也踩过坑!核心原因其实很直白:Angular的服务类(用@Injectable()装饰的类)并不支持ngOnInit生命周期钩子——这个钩子只对组件(@Component)和指令(@Directive)生效,服务在被注入初始化的时候,Angular根本不会调用它的ngOnInit方法。
给你两个简单可行的解决方案,按需选择:
方案1:在构造函数中直接调用getConfig()
既然服务初始化时一定会执行构造函数,那我们把getConfig()的调用移到构造函数里就行,这样配置会在服务创建时就加载完成,完全满足getTodos()的使用需求:
修改/src/providers/todo.service.ts中的构造函数:
constructor(private http: Http, private configService: ConfigService, private authService: AuthService) { this.getConfig(); // 直接在这里调用,替代ngOnInit的作用 }
之后你就可以删掉那个没用的ngOnInit方法了,留着也是白占代码行数~
方案2:懒加载配置(在getTodos时检查加载)
如果不想在构造函数里提前加载配置,也可以在调用getTodos()的时候先检查配置是否存在,不存在再临时获取:
getTodos() { // 先确保配置已加载完成 if (!this.config) { this.getConfig(); } return new Promise((resolve, reject) => { let headers = new Headers(); headers.append('Authorization', this.authService.token); this.http .get( this.config['baseUrl'] + '/api/todos', { headers: headers } ) .map(res => res.json()) .subscribe( data => { resolve(data); }, err => { reject(err); } ); }); }
不过方案1更贴合你的需求,能保证getTodos()执行时配置已经准备妥当,不用每次都做检查。
另外补个小建议:如果之后你的配置需要从远程接口加载,可以考虑用APP_INITIALIZER在应用启动时提前加载所有配置,这样所有服务都能直接使用配置,不用每个服务自己处理加载逻辑。不过对于你当前的本地静态配置,方案1就足够简洁高效啦。
内容的提问来源于stack exchange,提问作者davidesp
相关产品推荐
相关产品推荐

