2017-08-24 84 views
0

访问我有以下模式:类变量声明及其在角4

export class User { 
    email: string; 
    token: string; 
    username: string; 
    bio: string; 
    image: string; 
    constructor() {} 
} 

当我试图在另一个打字稿文件来实例化此,它抱怨不能在下面的屏幕截图所示:

IDE screenshot

任何的IDE,为什么我不能实例化这个并设置在这个模型中的所有属性?

编辑:从以下帖子的建议后,我仍然无法修复它!这是截图!

enter image description here

回答

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。这是代码,一旦你的组件被初始化(但之前的观点是准备好)

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:如果初始化包括异步代码,如从远程位置,你需要仔细返回一个承诺或可观察到的,并为您的代码要等到它解析为尝试使用获取数据服务。

+0

我想补充,你需要再this.payload访问有效载荷让利是对于那些在ECMA 6 –

+0

一个函数变量如何I S在实例化模型后模型中的属性? – sparkr

+0

@sparkr我已经添加到我的答案。 – BeetleJuice

2

您声明的变量为let。尝试没有它。它只能用于声明函数范围的变量.i。E以外的任何函数内像

constructor() { 
    let payload = new User(); 
} 

如果你想声明为类变量,它可能会像

private payload: User = new User(); 

声明之后的类变量可以使用this关键字在任何地方访问的一个方法内类,像

this.payload.email = '[email protected]'; 
+0

如何为我的用户模型中的字段设置值!我想所有的答案都错过了在模型中设置属性的值! – sparkr

+0

我会更新它 – Rajez

+0

期待! – sparkr