#html #angular #sweetalert #sweetalert2
#HTML #angular #sweetalert #sweetalert2
Вопрос:
Я хочу сделать следующее:
<button mat-icon-button color="primary" matTooltip="Merge" [swal]="{
title: 'Are you sure?',
input: 'text', inputPlaceholder: 'Please type the description in',
type: 'warning',
showCancelButton: true,
confirmButtonText: 'Yes',
cancelButtonText: 'Cancel',
confirmButtonClass: 'btn btn-primary',
cancelButtonClass: 'btn btn-outline-primary',
inputValidator: (value) => {
return new Promise((resolve) => {
if (value.length >= 3) {
resolve();
} else {
resolve('The description should be at least 3 characters!')
}
});
}
}">
<mat-icon>call_merge</mat-icon>
</button>
Как вы можете видеть, у меня здесь есть одна кнопка и материал sweetalert2. Когда пользователь нажимает кнопку, появляется окно с текстовым полем. Это текстовое поле должно содержать не менее 3 символов, в противном случае пользователь увидит сообщение об ошибке от sweetalert.
Проблема в том: Компилятор Angular недоволен inputValidator
. Компилятор всегда говорит, что где-то в лямбда-выражении inputValidator
скобки отсутствуют. Однако, если я удаляю inputValidator
, код работает.
Я также попытался определить компоненты swal отдельно, такие как
<swal
#MergeSwal
title="Are you sure?"
type="warning"
input="text"
inputPlaceholder="Please type the description in"
[showCancelButton]="true"
confirmButtonText="Yes"
cancelButtonText="Cancel"
confirmButtonClass="btn btn-primary"
cancelButtonClass="btn btn-outline-primary"
(inputValidator)="validate($event)">
</swal>
с функцией проверки
validate(event) {
console.log('It works');
return new Promise((resolve) => {
if (event.length >= 3) {
resolve();
} else {
resolve('The description should be at least 3 characters!')
}
});
}
и с этим кодом для кнопки
<button mat-icon-button color="primary" matTooltip="Merge" [swal]="MergeSwal">
<mat-icon>call_merge</mat-icon>
</button>
В этом случае окно sweetalert отображается правильно, но средство проверки не работает. По validate(...)
какой-то причине функция не выполняется.
Я также попытался определить функцию
merge() {
swal({
title: 'Are you sure?',
input: 'text',
inputPlaceholder: 'Please type the description in',
type: 'warning',
showCancelButton: true,
confirmButtonText: 'Yes',
cancelButtonText: 'Cancel',
confirmButtonClass: 'btn btn-primary',
cancelButtonClass: 'btn btn-outline-primary',
inputValidator: (value) => {
return new Promise((resolve) => {
if (value.length >= 3) {
resolve();
} else {
resolve('The description should be at least 3 characters!')
}
});
}
});
}
Затем я вызываю эту функцию при нажатии кнопки
<button mat-icon-button color="primary" matTooltip="Merge" (click)="merge()">
<mat-icon>call_merge</mat-icon>
</button>
В этом случае все работает хорошо, кроме .css
классов. Отображается необходимое сообщение об ошибке, но компилятор Angular, очевидно, не видит никаких .css
классов, определенных в .ts
файле. В результате отображается окно sweetalet со стандартными .css
классами.
Какой самый простой способ заставить inputValidator
его работать должным образом?
Комментарии:
1. Пожалуйста, создайте один stackblitz вашего кода.
2. Готово: stackblitz.com/edit/angular-ckhee3 В app.component.html , удалить все, начиная со строки 25 и заканчивая строкой 35 включительно. Я оставил этот код InputValidator в файле, чтобы показать, что компилятору не хватает некоторых круглых скобок. Работает только код, связанный с третьим ключом. Однако там используются только стандартные классы .css. Мой проект использует свои собственные классы .css, которые включены в качестве модуля узла.
Ответ №1:
Я решил проблему следующим образом:
В моем .ts
файле:
import { SwalComponent } from '@toverux/ngx-sweetalert2';
...
@ViewChild('mergeDialogSwal') private mergeDialogSwal: SwalComponent;
...
mergeDialogValidator(): void {
if (this.mergeDialogSwal === undefined) { return; }
this.mergeDialogSwal.inputValidator = (value) => {
return new Promise((resolve) => {
if (value.length >= 3) {
resolve();
} else {
resolve('The description should be at least 3 characters!');
}
});
};
}
В моем .html
файле:
<swal #mergeDialogSwal
title="Do you really want to merge the batches?"
text="You can not undo this action!"
type="warning"
input="text"
inputPlaceholder="Specify a description for the merged batch"
[showCancelButton]="true"
confirmButtonText="Yes, merge"
cancelButtonText="Cancel"
confirmButtonClass="btn btn-primary"
cancelButtonClass="btn btn-outline-primary"
[inputValidator]="mergeDialogValidator()"
(confirm)="mergeBatches()">
</swal>
...
<button (click)="mergeDialogSwal.show()">Click Me</button>
Возможно, это решение не совсем хорошее, но у меня нет другой идеи. Если кто-то может предложить лучшее решение, я был бы рад.
Stackblitz: https://stackblitz.com/edit/angular-xhdv9z
Ответ №2:
В компонентном html
<button mat-icon-button color="primary" matTooltip="Merge" [swal]="MergeSwal">
<mat-icon>call_merge</mat-icon>
</button>
<swal #MergeSwal
// all other options
[inputValidator]="mergeSwalValidator" >
</swal>
В компоненте ts
public mergeSwalValidator(value: string): string | null {
if (value.length >= 3) {
return null;
} else {
return 'The description should be at least 3 characters!';
}
}
Ответ №3:
/**
* Validate Swal Component to make sure
* reason is required before submitting
*
* @param {string} value
* @returns {Promise<string | null>}
*/
requiredReason = (value) => {
return new Promise(resolve => resolve(value ? null : 'You need to write something!'));
}
<swal #deleteMultipleSwal
title="Enter Reason"
input="textarea"
[inputValidator]="requiredReason"
inputPlaceholder="Nothing"
[showCancelButton]="true"
[text]="'Only items created in the last 2 hours will be deleted'"
[focusCancel]="true"
(confirm)="enqueueMultipleDeletions($event)">
</swal>