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.