2017-05-04 73 views
2

我想讓下面更像一個專橫的人。如何在將參數傳遞給Angular HTML時引用JavaScript包?

<div (click)="lastCall(999)">click me</div> 

我試圖用Number.MAX_SAFE_INTEGER但計算機抱怨它不被認可。所以下面的不起作用。

<div (click)="lastCall(Number.MAX_SAFE_INTEGER)">click me</div> 

我不得不像這樣在我的TS文件中聲明一個屬性。

private max: number = Number.MAX_SAFE_INTEGER; 

而且然後指像這樣。

<div (click)="lastCall(max)">click me</div> 

有沒有辦法在通話中直接通過Number.MAX_SAFE_INTEGER;?怎麼樣?

回答

1

,你必須寫

export class MyComponent { 
    max = Number.MAX_SAFE_INTEGER; // type inference FTW 
} 

的原因那個,而模板是邏輯上組件的一部分,它不能訪問與組件類相同的詞彙環境。 MyComponent有權訪問它的原因是MyComponent是普通的舊JavaScript代碼。

模板存在於不同的環境中。

如果使用不涉及全局變量的示例,則會變得更清楚。

考慮

類:

import {π} from 'app/constants'; 

export class MyComponent { 
    updateArea(radius: number) { 
    this.area = π * radius ** 2; 
    } 

    area?: number; 
} 

模板:

<input #radius type="number"> 
<button (click)="updateArea(radius.value)"> 
<span>{{area}}</span> 

在上文中,MyComponent.prototype.updateArea是封閉。由於詞法範圍的限制,它可以訪問導入的π變量。

如果我們想在模板中直接使用π,我們必須將其附加到模板範圍內的某個東西。通常我們只是將它附加到組件實例本身,就像你所做的那樣。

import {π} from 'app/constants'; 

export class CommonNumericalStuffComponent { 
    π = π; 
} 

π永遠不會改變。把它放在服務中是無稽之談。

對於這樣的用例,我認爲您的「解決方法」,如上面最後一個示例中重複的,實際上是正確的方法。

1

是通過聲明它爲注射常量。

@Injectable() 
export class Numbers{ 

public MAX_SAFE_INTEGER = 9999 
} 

它注入到組件構造

constructor(private Number:Numbers){} 

,然後用它在你的HTML作爲

<div (click)="lastCall(Number.MAX_SAFE_INTEGER)">click me</div> 
+1

這是最流暢的方式嗎?我的解決方法是在代碼隱藏方面創建一個額外的行。你建議的方法創建一個新文件,一個新類和一個額外的注入。我不以任何方式質疑你的意見。只是好奇,如果這是正確的(最好)的方式來做到這一點。 –

+0

是的。那就是應該如何使用硬編碼值。假設如果某天下來的最大值被修改爲「9999」,你會在所有文件中改變嗎? – Aravind

+0

當編寫單元測試時需要模擬最大安全整數時,這將非常方便。強大的解決方案。 –