HTML içindeki Typescript numarasına yaklaşılamıyor


87

MyService.service.ts MyComponent.component.ts ve MyComponent.component.html'de kullanmak için Typescript ile bir enum yaptım.

export enum ConnectionResult {
    Success,
    Failed     
}

MyService.service.ts'den tanımlı bir enum değişkenini kolayca alıp karşılaştırabilirim:

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

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

Ayrıca * ngIf deyimini kullanarak HTML'mde bir karşılaştırma yapmak için numaralandırmayı kullanmak istedim:

<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>

Kod derleniyor ancak tarayıcı bana bir hata veriyor:

Tanımsız özelliği okunamıyor

görüntü açıklamasını buraya girin

Aşağıdaki html gösterge hata satırı ile:

görüntü açıklamasını buraya girin

Numaralandırmaya neden bu şekilde yaklaşılamayacağını bilen var mı?

Yanıtlar:


157

Şablonun kapsamı, bileşen eşgörünüm üyeleriyle sınırlıdır. Bir şeye atıfta bulunmak istiyorsanız, orada olması gerekir

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

HTML'de artık kullanabilirsiniz

*ngIf="connectionResult.Success"

Ayrıca bkz . HTML şablonundan Angular2 genel değişkenlere erişim


1
Ben kesinlikle kodlama standartlarını takip ediyorum beri ne veri türü, ben connectionResult için vermek zorunda
— Nasrul BHARATHI

Bilmiyorum. Plunker'da sadece TypeScript kullandım ve hiçbir tür kontrolü yoktu. Uyumsuz bir tane kullandığınızda hata mesajının size beklenen türü söylemesini beklerdim, değil mi?
— Günter Zöchbauer

Teşekkürler, stack overflow'da yeni bir sohbet başlatmama izin verin
— Nasrul Bharathi

1
Evet, sadece bir mülk üyesi benim için işe yaramadı, ancak onu alıcı olarak ayarlamak işe yaradı.
— Kon

1
Diğer cevapta olduğu gibi adını koruyabileceğin gibi değil . (henüz keşfetmediklerim başka sorunlar yaratabilir)
— LosManos

51

.tsDosyaya aşağıdaki şekilde yazmanız gerekecektir .

enum Tenure { day, week, all }

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

Ve şimdi html'de bunu şu şekilde kullanabilirsiniz:

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

Umarım şimdi daha nettir. :)


3
TenureType ve Tenure arasında ':' değil '=' kullanmayı unutmayın, yani türü tanımlamayın. @Nikhil'in yazdıklarını gözden kaçırarak bu hatayı yaptım. +1
— Jacques

28

Enumu bileşeninize özellik olarak ekleyebilirsiniz şablonlarınızda aynı numaralandırma adını (Çeyreklik) kullanabilirsiniz:

enum Quarters{ Q1, Q2, Q3, Q4}

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

Şablonunuzda

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

Bunun işe yaramasının nedeni, yeni porperitenin temelde bu türden olmasıdır:

TileType: typeof TileType

Bir numaralandırmanın adını çıktı almak istiyorsanız, örneğin a divveya mat-iconöğeye değil, numaralandırmaya başvurmanız gerekir. Göstermesi açıklamaktan daha kolay:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
— LosManos 21

bu kesinlikle en temiz yoldur
— d3vtoolsmith

0

Enum aşağıdaki gibi tanımlanmışsa metin olarak bağlanabilirsiniz (bu değerler API'den gelen bir json dizesi değerini zorlamaz)

  export enum SomeEnum {
      Failure,
      Success,
  }

.Ts dosyasında

public status: SomeEnum;

.Html olarak

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

Angular 8+ ile test edilen başka bir yol da numaralandırmalara sahip olmaktır

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

.Ts dosyasında

public status: SomeEnum;

.Html olarak

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


Tüm numaralandırmaların otomatik olarak sayılarla geldiğine inanıyorum
— süper BT

İstediğine inanabilirsin ama ben test ettim ve böylece 2 yaklaşım sağladım. Yani hayır, bir sayı belirtmezseniz, C # gibi bir sayı gelmez. Bu davranış TypeScript sürümüne (+ belki Angular frx sürümü) tabi olabilir
— Pawel Cioch

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.