ไม่สามารถเข้าใกล้ typescript enum ภายใน HTML


87

ฉันสร้าง enum ด้วย typescript เพื่อใช้ใน MyService.service.ts MyComponent.component.ts และ MyComponent.component.html

export enum ConnectionResult {
    Success,
    Failed     
}

ฉันสามารถรับและเปรียบเทียบตัวแปร enum ที่กำหนดได้อย่างง่ายดายจาก MyService.service.ts:

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

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

ฉันต้องการใช้ enum เพื่อเปรียบเทียบภายใน HTML ของฉันโดยใช้คำสั่ง * ngIf:

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

โค้ดคอมไพล์ แต่เบราว์เซอร์ทำให้ฉันมีข้อผิดพลาด:

ไม่สามารถอ่านคุณสมบัติของ undefined

ป้อนคำอธิบายภาพที่นี่

ด้วยบรรทัดข้อผิดพลาดการบ่งชี้ html ต่อไปนี้:

ป้อนคำอธิบายภาพที่นี่

มีใครรู้บ้างว่าทำไม enum ถึงเข้าใกล้แบบนี้ไม่ได้?

คำตอบ:


157

ขอบเขตของเทมเพลต จำกัด เฉพาะสมาชิกอินสแตนซ์คอมโพเนนต์ หากคุณต้องการอ้างถึงบางสิ่งจำเป็นต้องมีอยู่ที่นั่น

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

ใน HTML คุณสามารถใช้ได้แล้ว

*ngIf="connectionResult.Success"

ดูตัวแปรส่วนกลางที่เข้าถึง Angular2 ได้จากเทมเพลต HTML


1
เนื่องจากฉันปฏิบัติตามมาตรฐานการเข้ารหัสอย่างเคร่งครัดประเภทข้อมูลใดฉันจึงต้องให้การเชื่อมต่อ
ผลลัพธ์

ฉันไม่รู้ ฉันใช้ TypeScript ใน Plunker เท่านั้นและไม่มีการตรวจสอบประเภท ฉันคาดว่าข้อความแสดงข้อผิดพลาดจะบอกประเภทที่คุณคาดหวังเมื่อคุณใช้งานที่เข้ากันไม่ได้ใช่หรือไม่
GünterZöchbauer

ขอบคุณให้ฉันเริ่มการสนทนาใหม่ใน stack overflow
Nasrul Bharathi

1
ใช่เพียงแค่สมาชิกคุณสมบัติธรรมดาไม่ได้ผลสำหรับฉัน แต่การตั้งค่าเป็น getter ทำงาน
คอน

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
อย่าลืมใช้ '=' และ not ':' ระหว่าง TenureType และ Tenure เช่นกำหนดประเภทไม่ได้กำหนด ฉันทำผิดพลาดที่มองข้ามสิ่งที่ @Nikhil เขียนไว้ +1
Jacques

28

คุณสามารถเพิ่ม enum ให้กับส่วนประกอบของคุณเป็นคุณสมบัติและใช้ชื่อเดียวกันของ enum (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> 

เหตุผลที่มันใช้งานได้คือ porperty ใหม่โดยพื้นฐานแล้วเป็นประเภทนี้:

TileType: typeof TileType

หากคุณต้องการส่งออกชื่อของ enum เช่นใน a divหรือmat-iconคุณต้องอ้างอิง enum ไม่ใช่รายการโดยตรง แสดงง่ายกว่าอธิบาย:<mat-icon svgIcon="{{Quarters[Quarters.Q1]}}"></mat-icon>
LosManos

นี่เป็นวิธีที่สะอาดที่สุดอย่างแน่นอน
d3vtoolsmith

0

คุณสามารถผูกเป็นข้อความได้หาก enum กำหนดไว้ด้านล่าง (ค่าเหล่านั้นจะไม่บังคับใช้ค่าสตริง json ที่มาจาก API)

  export enum SomeEnum {
      Failure,
      Success,
  }

ในไฟล์. ts

public status: SomeEnum;

ใน. html

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

อีกวิธีหนึ่งที่ทดสอบใน Angular 8+ คือการมี enum พร้อมตัวเลข

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

ในไฟล์. ts

public status: SomeEnum;

ใน. html

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


ฉันเชื่อว่า enums ทั้งหมดมาพร้อมกับตัวเลขโดยอัตโนมัติ
super IT guy

คุณสามารถเชื่อในสิ่งที่คุณต้องการ แต่ฉันทดสอบแล้วจึงให้ 2 แนวทาง ดังนั้นไม่ถ้าคุณไม่ระบุตัวเลขก็จะไม่มีตัวเลขเหมือนใน C # พฤติกรรมนี้อาจขึ้นอยู่กับเวอร์ชัน TypeScript (+ อาจจะเป็นรุ่น Angular frx)
Pawel Cioch

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.