عندما يقوم المستخدم ببعض الإجراءات الهامة و / أو التي لا رجعة فيها ، قبل إرسال طلب إلى الخادم ، عليك أن تطلب من المستخدم التأكيد.كقاعدة ، يتم عرض مشروط "هل أنت متأكد من أنك تريد القيام بذلك وذاك وذاك" وهناك زرين أدناه: نعم و لا. إذا نقر المستخدم على "نعم" ، فإننا نرسل طلبًا إلى الخادم ونغلق النموذج. إذا لم يكن الأمر كذلك ، فأغلق النموذج.هذه هي الوظيفة القياسية الشائعة الاستخدام في عدة أماكن في المشروع. أيضًا ، عند إنشاء وظائف المشروع ، من المحتمل أن تضيف بعض الأماكن الأخرى التي تحتاج إلى مشروط مع التأكيد. لذلك ، من أجل تجنب تكرار التعليمات البرمجية ، يجب أخذ مثل هذا الوسيط بشكل لا لبس فيه في مكون منفصل. لتجنب إغراء مطرقة العكازات ، يجب أن يكون هذا المكون متعدد الاستخدامات وسهل الاستخدام قدر الإمكان.دعنا ننتقل من كلمات إلى عمل. لعرض الوسائط ، سنستخدم 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>
</div>
</div>
نعم لا modal.component.tsimport {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.tsimport {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 () ، والذي يتم استدعاؤه بالنقر على زر الحذف ، وطريقة الحذف () ، التي يطلق عليها الحدث المشروط. إذا كان لديك العديد من هذه الوسائط في مكون واحد لإجراءات المستخدم المختلفة ، فستتأثر قابلية قراءة التعليمات البرمجية بالفعل.في التعليقات ، كما هو الحال دائمًا ، أتوقع انتقادات بناءة ومعقولة.