HTML内のTypescript列挙型にアプローチできません


87

MyService.service.tsMyComponent.component.tsおよびMyComponent.component.htmlで使用するTypescriptを使用して列挙型を作成しました。

export enum ConnectionResult {
    Success,
    Failed     
}

MyService.service.tsから定義済みの列挙型変数を簡単に取得して比較できます。

this.result = this.myService.getConnectionResult();

switch(this.result)  
{
    case ConnectionResult.Failed:
         doSomething();
         break;
    case ConnectionResult.Success:
         doSomething();
         break;
}

また、* ngIfステートメントを使用して、HTML内の比較に列挙型を使用したいと思いました。

<div *ngIf="result == ConnectionResult.Success; else failed">
            <img src="../../assets/connection-success.png" height="300px" class="image-sign-style" />
</div>
<ng-template #failed>
       <img src="../../assets/connection-failed.png" height="300px" class="image-sign-style" />
</ng-template>

コードはコンパイルされますが、ブラウザでエラーが発生します。

未定義のプロパティを読み取ることができません

ここに画像の説明を入力してください

次のhtml表示エラー行があります。

ここに画像の説明を入力してください

列挙型にこのようにアプローチできない理由を誰かが知っていますか?

回答:


157

テンプレートのスコープは、コンポーネントインスタンスメンバーに制限されています。あなたが何かを参照したい場合は、そこで利用可能である必要があります

class MyComponent {
  public get connectionResult(): typeof ConnectionResult {
    return ConnectionResult; 
  }
}

HTMLで使用できるようになりました

*ngIf="connectionResult.Success"

HTMLテンプレートからのAngular2アクセスグローバル変数も参照してください。


1
私はコーディング標準、どのデータ型に厳密に従っているので、connectionResultに与える必要があります
NasrulBharathi18年

知りません。私はPlunkerでTypeScriptのみを使用し、タイプチェックはありませんでした。互換性のないタイプを使用すると、エラーメッセージに予想されるタイプが表示されると思いますね。
ギュンターZöchbauer

ありがとう、スタックオーバーフローで新しい会話を始めましょう
NasrulBharathi18年

1
はい、単純なプロパティメンバーだけでは機能しませんでしたが、ゲッターとして設定することは機能しました。

1
あなたが名前を保つことができるという他の答えのようではありません。(他の問題しかし、私はまだ発見されていないものを作成することがあります)
LosManos

51

次のように.tsファイルに書き込む必要があります。

enum Tenure { day, week, all }

export class AppComponent {
    tenure = Tenure.day
    TenureType = Tenure
}

そして今htmlであなたはこれを次のように使うことができます

*ngIf = "tenure == TenureType.day ? selectedStyle : unSelectedStyle"

今はもっとはっきりしているといいのですが。:)


3
TenureTypeとTenureの間で「:」ではなく「=」を使用することを忘れないでください。つまり、タイプを割り当てて定義しないでください。@Nikhilが書いたものを見落としている私はちょうどその間違いを犯しました。+1
ジャック

28

列挙型をプロパティとしてコンポーネントに追加し、テンプレートで列挙型と同じ名前(Quarters)を使用できます。

enum Quarters{ Q1, Q2, Q3, Q4}

export class AppComponent {
   quarter = Quarters.Q1
   Quarters = Quarters
}

テンプレート内

<div *ngIf="quarter == Quarters.Q1">I=am only visible for Q1</div> 

これが機能する理由は、新しいポーパティが基本的にこのタイプであるためです。

TileType: typeof TileType

のように列挙型の名前を出力する場合、divまたはmat-iconアイテムを直接参照するのではなく、列挙型を参照する必要がある場合。より簡単な説明よりも、表示する:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos

これは間違いなくクリーンな方法である
d3vtoolsmith

0

列挙型が以下のように定義されている場合は、テキストとしてバインドできます(これらの値は、APIからのjson文字列値を強制しません)

  export enum SomeEnum {
      Failure,
      Success,
  }

.tsファイル内

public status: SomeEnum;

.htmlで

<div *ngIf="status == 'Success'">

Angular 8+でテストされた別の方法は、数値の列挙型を持つことです

  export enum SomeEnum {
      Failure = 0,
      Success = 1,
  }

.tsファイル内

public status: SomeEnum;

.htmlで

<div *ngIf="status == 1">


すべての列挙型には自動的に数字が付いてくると思います
スーパーIT担当者

あなたはあなたが望むものを信じることができますが、私はそれをテストし、したがって2つのアプローチを提供しました。したがって、番号を指定しないと、C#のように番号が付いていません。この動作は、TypeScriptバージョン(+おそらくAngular frxバージョン)の影響を受ける可能性があります
PawelCioch20年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.