Обновление 1: Основываясь на ответе @PierreDuc, я разработал и создал здесь более простую версию: Упрощенный пример .Чувак, я помню, как в AngularJS была возможность полностью взломать (щелкнуть) функцию и выполнить ее.Я понимаю, я понимаю, мне нравится упрощенное предложение ниже, хотя.Это должно работать для меня:)
Я создал директиву Angular для кнопки, которая принимает метод в качестве Promise.
При нажатии я отключаю кнопку.Когда Обещание выполнено, я снова активирую кнопку.
По сути, при нажатии я хочу отключить кнопку, пока не будет завершена вся обработка, выполняемая этим событием кнопки, включая любые вызовы http.
Я выполнил свою цель, показанную здесь: Пример Stackblitz .
Мне не особенно нравится мое "решение".
Это слишком сложно.Чтобы заставить его работать, должно произойти три вещи.
- Директива добавляется к кнопке.
- Устанавливается свойство "waitFor".
- Функция "waitFor" должна быть функцией, которая возвращает Promise.
ИМО, это слишком много вещей, которые нужно выровнять, чтобы заставить его работать.
Что я действительно хотел бы сделать, так это получить представление о методе (click)Нажмите кнопку и выполните ее вручную в директиве так же, как я сделал свое свойство waitFor.
Как я могу это сделать?
Как минимум, я бы хотел директиву, которая нетребуется как имя директивы ("appClickWait"), так и свойство ("[waitFor]").
Вот код для вашего удобства:
Директива:
import { Directive, HostListener, ElementRef, Output, Input, EventEmitter, Renderer2 } from '@angular/core';
// Enfore this directvie can only be used on a button?
@Directive({
selector: '[appClickWait]'
})
export class ClickWaitDirective {
@Input("waitFor") clickWait: any;
constructor(private el: ElementRef, private renderer: Renderer2) { }
@HostListener('click', ['$event'])
clickEvent(event) {
event.preventDefault();
event.stopPropagation();
this.renderer.setAttribute(this.el.nativeElement, 'disabled', 'disabled');
const originalInnerText = this.el.nativeElement.innerText;
this.el.nativeElement.innerText = 'Processing...';
const reset = () => {
this.renderer.removeAttribute(this.el.nativeElement, 'disabled');
this.el.nativeElement.innerText = originalInnerText;
};
// I really would like to just get a handle on the (click) function here
// that would greatly simplify the useage of this directive
this.clickWait()
.then((data) => {
reset();
})
.catch(err => {
console.error(err);
reset();
});
}
}
Шаблон:
myClickFunc = async () => {
console.log('start')
this.posts = [];
// too fast, let's wait a bit
// this.posts = await this.http.get('https://jsonplaceholder.typicode.com/posts').toPromise();
await new Promise((resolve, reject) => {
setTimeout(async () => {
try {
this.posts = await this.http.get('https://jsonplaceholder.typicode.com/posts').toPromise();
} catch (err) {
reject(err);
}
resolve();
}, 1000);
});
console.log('all done');
}
<button type="button" appClickWait [waitFor]="myClickFunc">Single Wait Click</button>
Спасибо!