Angular2 - 如何在服务中初始化数据?

时间:2017-08-10 14:23:12

标签: angular angular-services

我有两项服务。 login.service.tsenvironment-specific.service.ts

login.service.ts中,我需要从environment-specific.service.ts初始化一个Json对象,该对象传递了几个链接。

用例是如何在没有ngOnInit(){}的情况下在servcie中工作,因为根据Angular2 Lifecycle Hook,ngOnInit()不能在servcie中使用。

在这里,我找到了必须在login.service.ts内部初始化的部分 - 当然没有ngOnInit()方法:

...
import { EnvSpecific } from '../models/env-specific';
import { ActivatedRoute } from "@angular/router";

@Injectable()
export class LoginService {

   link1: string;
   link2: string;
   link3: string;

   constructor(private http: Http, private fbuilder:FormBuilder, private route: ActivatedRoute) { }

   ngOnInit(){
      this.route.data
         .subscribe((data: { envSpecific: EnvSpecific }) => {
            this.link1 = data.envSpecific.link1;
            this.link2 = data.envSpecific.link2;
            this.link3 = data.envSpecific.link3;
      });
   }
   ...
   ...
}

我希望将链接传递给传递给不同http.post API调用的网址。 e.g:

...
var obsRequest = this.http.post( this.link1, serializedForm, this.options )
...

错误很明确:link1 is undefined

有任何建议或提示吗?

2 个答案:

答案 0 :(得分:2)

您可以将服务中的ngOnInit中的逻辑移动到服务的构造函数中。但即便如此,link1属性可能不会立即设置,因此您可能希望为其提供默认值。

但这对我来说似乎是反模式。您可以使用Angular CLI默认设置的本机Angular 2环境。

它有开发/生产变体,您可以根据需要在那里设置您的值,并将其导入您的服务中。根据你ng build的方式(如果你传递-prod标志),将使用不同的env变量。

答案 1 :(得分:0)

在使用服务之前,您可以先通过应用初始化来初始化服务。

可以使用APP_INITIALIZER完成,请参见:

https://devblog.dymel.pl/2017/10/17/angular-preload/

Angular: How to correctly implement APP_INITIALIZER