关键字let
不应在这方面可以使用。请使用以下方法之一:
private payload = new User(); // if you don't want this accessible outside the class
public payload = new User(); // if class outsiders should access it directly
你问:
如何设置模型的属性实例之后?
正确的位置是ngOnInit
lifecycle hook。这是代码,一旦你的组件被初始化(但之前的观点是准备好)
export class MyComponent implements OnInit {
private someProperty:int;
ngOnInit(){
this.someProperty = 7;
}
}
如果你有很多工作要做,只是打电话给你不同的初始化函数从ngOnInit
角内执行。在你的代码中,你有一个服务。由于这不是一个组件,它不能使用这个生命周期钩子。如果你已经知道属性的值,你写的代码(从你的第二个屏幕截图看来,你这样做),你可以直接设置它:
private payload:User = {
email: '...',
token: '...'
}
但机会是你不知道这一切的东西,它将被设置为一个函数的结果。然后,正确的方法是从您将使用该服务的组件调用的初始化函数。
@Injectable()
export class UserService {
private isInitialized:boolean = false;
private payload:User;
public init(){
// init() should only run once
if(this.isInitialized) return;
this.payload = new User();
this.payload.email = '...';
this.payload.token = this.someFunction();
// to prevent init() from running again
this.isInitialized = true;
}
private someFunction(){return 'token';}
}
然后在任何组件中,您需要做的就是在使用它之前调用this.userService.init()
。
注1:对于服务有一个全局实例,则必须在providers
阵列的主要AppModule
的上市,而不是在其他地方提供。
注2:如果初始化包括异步代码,如从远程位置,你需要仔细返回一个承诺或可观察到的,并为您的代码要等到它解析为尝试使用获取数据服务。
我想补充,你需要再this.payload访问有效载荷让利是对于那些在ECMA 6 –
一个函数变量如何I S在实例化模型后模型中的属性? – sparkr
@sparkr我已经添加到我的答案。 – BeetleJuice