我有以下型号:
export class User {
email: string;
token: string;
username: string;
bio: string;
image: string;
constructor() {}
}
当我尝试在另一个Typescript文件中实例化它时,它会抱怨它不能如下面的截图所示:
为什么我无法实例化这个并在此模型中设置所有属性的任何想法?
编辑:根据以下帖子的建议,我仍然无法修复它!这是截图!答案 0 :(得分:4)
不应在该上下文中使用关键字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。这是Angular在组件初始化后(但在视图准备好之前)执行的代码
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
的{{1}}数组中,并且不会在其他任何位置提供。
注2:如果初始化涉及异步代码,例如从远程位置获取数据,则需要小心返回promise或Observable,并让代码等到它结算尝试使用该服务。
答案 1 :(得分:2)
您使用AppModule
声明变量。尝试没有它。它只能用于在任何函数中声明函数作用域变量。在任何函数中,如
let
如果你想声明为类变量,可能就像
constructor() {
let payload = new User();
}
声明后,可以在类的方法内的任何位置使用private payload: User = new User();
关键字访问类变量,例如
this