2017-08-24 82 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