Açısal olarak iki anahtar durumu değeri


87

Php ve java'da yapabiliriz

case 1:
case 2:
   echo "something";

böylece değer 1 veya 2 olduğunda ekrana "bir şey" yazdırılacak, açısal bir uygulama oluşturuyorum aşağıdaki gibi bir şey yapıyorum

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="'multi-choice'">FORM 1</div>
  <div *ngSwitchCase="'singe-choice'">FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>

Tek seçim için kullanılan form çoklu seçim için kullanılabilir, ancak daha düzenli hale getirmek için aşağıdaki gibi bir şey denedim

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="'multi-choice' || 'singe-choice'">FORM 1</div>
</div>

Kötü şansım işe yaramadı, kimse bunu yapmanın daha iyi bir yolunu önerebilir mi?


Yanıtlar:


145

(Un) Neyse ki yapamazsınız; ngSwitchKaynak kodu bakarsak oldukça “aptal” dir: bu sadece bir var ===vaka değeri ve anahtar değer arasında. İki seçeneğiniz var, ancak ikisi de harika olmaktan uzak.

Seçenek 1 yönergeyi kullanmaktır *ngSwitchDefault, ancak bu yalnızca birden çok vakanızın tümü FORM 1 ise işe yarar:

<div [ngSwitch]="data.type">
  <div *ngSwitchDefault>FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>

Oldukça ayrıntılı olan diğer seçenek ise şöyle bir şey yapmak:

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="data.type === 'multi-choice' || data.type === 'singe-choice' ? data.type : '' ">FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>

2
Şu anda ilk yöntemi
uyguluyorum

13
İkinciye gidiyorum çünkü varsayılan başka bir anlama geliyor, bu fikir için teşekkürler!
Sebastien DErrico

4
Bir kişiye ihtiyaçları olmadığını, orada bu atıyorum orbir Switch Case... belki bir ihtiyaç *ngIfyerine switch: \
MoshMage

İkinci yaklaşım harika.
khichar.anil

4
Geliştirilebilir:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
Maiko Kingma

62

Çok daha esnek olan aşağıdakileri de kullanabilirsiniz. Daha sonra, * ngSwitchCase değeri olarak boole olarak değerlendirilen her şeyi koyabilirsiniz.

<div [ngSwitch]="true">
    <div *ngSwitchCase="data.type === 'multi-choice' || data.type === 'singe-choice'">FORM 1</div>
    <div *ngSwitchCase="data.type === 'range'">FORM 2</div>
    <div *ngSwitchDefault>FORM 3</div>
</div>

Bunun * ngIf bloklarını kullanmaya göre avantajı, yine de bir varsayılan belirleyebilmenizdir.


47

Bunu uygulamak için kullanabilirsiniz ngTemplateOutlet:

<ng-container [ngSwitch]="variable">
    <ng-container *ngSwitchCase="1">
        <ng-container *ngTemplateOutlet="form1"></ng-container>
    </ng-container>
    <ng-container *ngSwitchCase="2">
        <ng-container *ngTemplateOutlet="form1"></ng-container>
    </ng-container>
    <ng-container *ngSwitchCase="3">FORM 2</ng-container>
    <ng-container *ngSwitchDefault>FORM 3</ng-container>
    <ng-template #form1>FORM 1</ng-template>
</ng-container>

Güncelleme

Eğik hala ederken dikkate böyle bir özelliği, en jonrimmer var anahtar-cases.directive.ts . Kullanım örneği:

<ng-container [ngSwitch]="variable">
    <ng-container *jrSwitchCases="[1, 2]">FORM 1</ng-container>
    <ng-container *ngSwitchCase="3">FORM 2</ng-container>
    <ng-container *ngSwitchDefault>FORM 3</ng-container>
</ng-container>


8
Bu, açık ara en temiz ve en az hackli çözümdür. Dokümanlarda da şu ipucu verilmektedir : "Her anahtar durumu ifadesi, bir satır içi HTML şablonu veya şablon referansı içerir"
t.animal

2
Bu çözüm en temiz sonucu verir. Teşekkür ederim!
cuddlemeister

1
Bir uyarı kelimesi: #form1AnahtarCase 1 ve 2 arasında içeriği yeniden işlenecek. Çoğu kişi için bu önemli değil, ancak bileşen karmaşıksa, şimdilik * ngIf ile daha iyi durumda olursunuz.
Jesse

17

İşte anlamı şaşırtmadan daha yoğun bir çözüm üretmek için Fabio'nun ikinci cevabını brian3kb ile birleştiren bir varyasyon.

Bir servis talebi için birden fazla eşleşme varsa, array.includes()her seçeneği ayrı ayrı karşılaştırmak yerine kullanır .

Kabul edilen cevaba göre çok daha yoğun olacağından ikiden fazla eşleşme varsa özellikle yararlıdır.

<div [ngSwitch]="data.type">
   <div *ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : ''">FORM 1</div>
   <div *ngSwitchCase="'range'">FORM 2</div>
   <div *ngSwitchDefault>FORM 3</div>
</div>

Eşleşmeler bir değişkendeyse, array.indexOf()koşullu üçlü operatörün kullanımından kaçınmak için kullanabilirsiniz.

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="matches[matches.indexOf(data.type)]">FORM 1</div>
  <!-- ... -->
</div>

16

Gibi MoshMage önerdi, ben bir kullanarak sona erdi *ngIfseçeneklerin birkaç ele bileşenleri için bu işlemek için:

 *ngIf="['Transformation', 'Field Mapping', 'Filter'].includes(selectedWorkflow.type)"

1

Deneyin ng-switch-when-separator="|"içindeng-switch

<div ng-switch="temp">
    <div ng-switch-when="1|2" ng-switch-when-separator="|"> echo "something"</div>
</div>

5
Lütfen bu direktifin (aka v1)Angular değil AngularJS'nin bir özelliği olduğunu unutmayın (aka v2 or higher). Geçmişte talep edilmiş olsa da, henüz Angular 2'den Angular 9'a kadar (bu yorumun tarihinde) herhangi bir versiyonda sunulmamaktadır.
NunoM

1

İşte bunu nasıl yapacağım:

İçinde .component.ts:

getFormType(type: string) {
  switch(type) {
    case 'singe-choice':
    case 'multi-choice':
      return 'singe-choice|multi-choice'
    default:
      return type;
  }
}

Ardından, şablon dosyanızda şuna benzer bir şey yapabilirsiniz:

<div [ngSwitch]="getFormType(data.type)">
   <div *ngSwitchCase="'singe-choice|multi-choice'">FORM 1</div>
   <div *ngSwitchCase="'range'">FORM 2</div>
   <div *ngSwitchDefault>FORM 3</div>
</div>

Yine de yazım hatalarına dikkat edin ...

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.