نحن نلف في نافذة تأكيد مشروط وعد

عندما يقوم المستخدم ببعض الإجراءات الهامة و / أو التي لا رجعة فيها ، قبل إرسال طلب إلى الخادم ، عليك أن تطلب من المستخدم التأكيد.

كقاعدة ، يتم عرض مشروط "هل أنت متأكد من أنك تريد القيام بذلك وذاك وذاك" وهناك زرين أدناه: نعم و لا. إذا نقر المستخدم على "نعم" ، فإننا نرسل طلبًا إلى الخادم ونغلق النموذج. إذا لم يكن الأمر كذلك ، فأغلق النموذج.

هذه هي الوظيفة القياسية الشائعة الاستخدام في عدة أماكن في المشروع. أيضًا ، عند إنشاء وظائف المشروع ، من المحتمل أن تضيف بعض الأماكن الأخرى التي تحتاج إلى مشروط مع التأكيد. لذلك ، من أجل تجنب تكرار التعليمات البرمجية ، يجب أخذ مثل هذا الوسيط بشكل لا لبس فيه في مكون منفصل. لتجنب إغراء مطرقة العكازات ، يجب أن يكون هذا المكون متعدد الاستخدامات وسهل الاستخدام قدر الإمكان.

دعنا ننتقل من كلمات إلى عمل. لعرض الوسائط ، سنستخدم Bootstrap.

في الواقع إصداري من هذا المكون:

نعم لا modal.component.html
<div bsModal #yesNoModal="bs-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog modal-{{type}}" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title">{{title}}</h4>
        <button type="button" class="close" (click)="onNoClick()" aria-label="Close">
          <span aria-hidden="true">×</span>
        </button>
      </div>
      <div class="modal-body">
        <p>{{body}}</p>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" (click)="onNoClick()">{{noBtnText}}</button>
        <button type="button" class="btn btn-{{type}}" (click)="onYesClick()">{{yesBtnText}}</button>
      </div>
    </div><!-- /.modal-content -->
  </div><!-- /.modal-dialog -->
</div><!-- /.modal -->

نعم لا modal.component.ts
import {Component, Input, OnInit, ViewChild} from '@angular/core';
import {ModalDirective} from 'ngx-bootstrap/modal';

@Component({
  selector: 'app-yes-no-modal',
  templateUrl: './yes-no-modal.component.html',
  styleUrls: ['./yes-no-modal.component.css']
})
export class YesNoModalComponent implements OnInit {

  @ViewChild('yesNoModal') public yesNoModal: ModalDirective;

  @Input() private type = 'info';
  @Input() private title = '';
  @Input() private body = '';
  @Input() private yesBtnText = '';
  @Input() private noBtnText = '';

  constructor() { }

  ngOnInit(): void {
  }

  public showAsync(data = null): Promise<any> {
    return new Promise<any>((resolve, reject) => {
      this.yesNoModal.show();
      this.onYesClick = () => {
        this.yesNoModal.hide();
        resolve(data);
      };
      this.onNoClick = () => {
        this.yesNoModal.hide();
        reject(data);
      };
    });
  }

  private onYesClick(): any {}
  private onNoClick(): any {}

}

أضع عنوان التحذير ، نص التحذير ، نظام الألوان / مستوى الأهمية (الخطر ، المعلومات ، التحذير) في المعلمات ، يمكنك أيضًا إعادة تعريف التسمية على الأزرار.

لإظهار الوسائط ، اتصل بـ showAsync ، حيث يمكننا نقل البيانات العشوائية. نحصل على نفس البيانات في حل / رفض.

بعد ذلك ، قم بتوصيل الوسائط في مكون آخر:

account.component.html
<app-yes-no-modal
  #deleteModal
  body="     ?"
  title=""
  type="danger"
></app-yes-no-modal>
<button (click)="delete()"></button>

account.component.ts
import {Component, OnInit, ViewChild} from '@angular/core';
import {YesNoModalComponent} from '../_common/yes-no-modal/yes-no-modal.component';
import {DeleteUserEndpoint} from '../../api/delete-user.endpoint';
import {ErrorService} from '../../services/error/error.service';

@Component({
  selector: 'app-account',
  templateUrl: './account.component.html',
  styleUrls: ['./account.component.css'],
  providers: [DeleteUserEndpoint]
})
export class AccountComponent implements OnInit {


  @ViewChild('deleteModal') public deleteModal: YesNoModalComponent;

  constructor (private deleteUserEndpoint: DeleteUserEndpoint) {
  }

  delete(data) {
    this.deleteModal.showAsync(data).then(result => {
      this.deleteUserEndpoint.execute(result);
    });
  }

  ngOnInit(): void {
  }
}

في رأيي ، يبدو استخدام مثل هذا الحل بسيطًا ومقروءًا قدر الإمكان.

للمقارنة ، عند استخدام EventEmitter ، سيكون عليك تحديد طريقتين في كل مكون - showDeleteModal () ، والذي يتم استدعاؤه بالنقر على زر الحذف ، وطريقة الحذف () ، التي يطلق عليها الحدث المشروط. إذا كان لديك العديد من هذه الوسائط في مكون واحد لإجراءات المستخدم المختلفة ، فستتأثر قابلية قراءة التعليمات البرمجية بالفعل.

في التعليقات ، كما هو الحال دائمًا ، أتوقع انتقادات بناءة ومعقولة.

All Articles