ปุ่มปิดการใช้งาน Angular2


113

ฉันรู้ว่าในangular2ฉันสามารถปิดการใช้งานปุ่มที่มี [disable]แอตทริบิวต์ตัวอย่างเช่น:

<button [disabled]="!isValid" (click)="onConfirm()">Confirm</button>

แต่ฉันสามารถทำได้โดยใช้[ngClass]หรือ[ngStyle]? ชอบมาก:

<button [ngStyle]="{disabled : !isValid}" (click)="onConfirm()">Confirm</button>

ขอบคุณ.


1
นี่คือการทำงานของ plnkr สำหรับplnkr.co/edit/MW3vT4XscWcKrDdAwBoE?p=preview
Pardeep Jain

คำตอบ:


173

อัปเดต

ฉันสงสัย. ทำไมคุณไม่ต้องการใช้การ[disabled]ผูกแอตทริบิวต์ที่ Angular 2 ให้มา? เป็นวิธีที่ถูกต้องในการรับมือกับสถานการณ์นี้ ฉันขอเสนอให้คุณย้ายisValidเช็คของคุณด้วยวิธีส่วนประกอบ

<button [disabled]="! isValid" (click)="onConfirm()">Confirm</button>

ปัญหาเกี่ยวกับสิ่งที่คุณพยายามอธิบายไว้ด้านล่าง

โดยทั่วไปคุณสามารถใช้ngClassที่นี่ได้ แต่การเพิ่มคลาสจะไม่ จำกัด เหตุการณ์ไม่ให้เริ่มทำงาน สำหรับการเริ่มต้นเหตุการณ์ด้วยอินพุตที่ถูกต้องคุณควรเปลี่ยนclickรหัสเหตุการณ์เป็นด้านล่าง ดังนั้นonConfirmจะถูกยิงเมื่อฟิลด์ถูกต้องเท่านั้น

<button [ngClass]="{disabled : !isValid}" (click)="isValid && onConfirm()">Confirm</button>

สาธิตที่นี่


ฉันเพิ่ม ngClass allready นั้นลงในปุ่มดังนั้นมันจึงดูเหมือนว่าฉันปิดการใช้งานจำเป็นต้องเป็นของเธอทำไมจึงเลือกวิธี [ปิดการใช้งาน]?
Nir Schwartz

@NirSchwartz เพราะมันจะทำทั้งสองสิ่งพร้อมกัน .. กฎ css ตัวเลือกจะถูกนำไปใช้กับbutton[disabled]เหตุการณ์ที่เลือกและปิดใช้งานจะ จำกัดclickเหตุการณ์ให้เริ่มทำงานบนปุ่ม .. ในngClassชั้นเรียนสิ่งที่คุณต้องจัดการด้วยตัวเองตามที่ฉันแสดงใน คำตอบข้างต้น ..
Pankaj Parkar

สาเหตุที่ผู้คนต้องการใช้ [attr.disabled] แทนที่จะเป็น [disabled] เนื่องจาก [ปิดการใช้งาน] ของ FormControl เชิงมุมไม่สามารถตั้งค่าแบบไดนามิกได้ นี่คือปัญหาgithub.com/angular/angular/issues/11271
davyzhang

1
คุณไม่ควรเรียกใช้เมธอดในการผูกเทมเพลต [disabled]="!isValid"
ทอม

3
อ่าฮะ .. ถ้าเมธอดมีแค่การอ้างอิงตัวแปรก็ใช้ได้ .. ถ้าคุณมีลอจิกที่ซับซ้อนภายในฟังก์ชันแสดงว่าไม่ต้องการ คุณถูกต้องในกรณีนี้ฉันสามารถเรียกisValidแฟ
ล็ก

39

ฉันจะแนะนำสิ่งต่อไปนี้

<button [disabled]="isInvalid()">Submit</button>

4
ไม่ดีกว่าที่จะหลีกเลี่ยงการเรียกใช้ฟังก์ชันใน html เนื่องจากจะเรียกว่าแต่ละเห็บ / รอบ?
John



5

การใช้ngClassเพื่อปิดใช้งานปุ่มสำหรับรูปแบบที่ไม่ถูกต้องไม่ใช่แนวทางปฏิบัติที่ดีใน Angular2 เมื่อมีการให้คุณสมบัติ inbuilt เพื่อเปิดใช้งานและปิดใช้งานปุ่มหากแบบฟอร์มถูกต้องและไม่ถูกต้องตามลำดับโดยไม่ต้องใช้ความพยายาม / ตรรกะเพิ่มเติม

[disabled] จะทำทุกอย่างเช่นถ้าแบบฟอร์มถูกต้องก็จะเปิดใช้งานและหากแบบฟอร์มไม่ถูกต้องระบบจะปิดใช้งานโดยอัตโนมัติ

ดูตัวอย่าง:

<form (ngSubmit)="f.form.valid" #f="ngForm" novalidate>
<input type="text" placeholder="Name" [(ngModel)]="txtName" name="txtname" #textname="ngModel" required>
<input type="button" class="mdl-button" [disabled]="!f.form.valid" (click)="onSave()" name="">


3

อาจอยู่ด้านล่างรหัสสามารถช่วยได้:

<button [attr.disabled]="!isValid ? true : null">Submit</button>

นี่ไม่ใช่วิธีแก้ปัญหาที่ดีเนื่องจาก<button disabled="">หรือ<button disabled="false">ยังคงได้รับการจัดการเหมือนปุ่มปิดใช้งานในเบราว์เซอร์ส่วนใหญ่
BillyTom

2

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

<button (click)="!planNextDisabled && planNext()" [disabled]="planNextDisabled"></button>

2

หากคุณกำลังใช้รูปแบบปฏิกิริยาและต้องการปิดใช้งานอินพุตบางอย่างที่เกี่ยวข้องกับตัวควบคุมฟอร์มคุณควรวางdisabledตรรกะนี้ลงในโค้ดของคุณและเรียกyourFormControl.disable()หรือyourFormControl.enable()


2

ฉันคิดว่านี่เป็นวิธีที่ง่ายที่สุด

<!-- Submit Button-->
<button 
  mat-raised-button       
  color="primary"
  [disabled]="!f.valid"
>
  Submit
</button>

1
 <button [disabled]="this.model.IsConnected() == false"
              [ngClass]="setStyles()"
              class="action-button action-button-selected button-send"
              (click)= "this.Send()">
          SEND
        </button>

.ts รหัส

setStyles() 
{
    let styles = {

    'action-button-disabled': this.model.IsConnected() == false  
  };
  return styles;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.