Мое мобильное (ионное) приложение выполняет вызов API, когда пользователь вводит что-то в поле ввода и выполняет операцию «onblur» (фокусировка).
Если пользователь переходит к следующему полю ввода или просто нажимает на другое поле ввода, происходит «onblur» и выполняется вызов API (ajax) и изображение загрузчика появляется во время обработки запроса. Этот образ загрузчика на передней панели должен ограничивать пользователя от ввода в любое из полей ввода во время выполнения вызова.
Проблема, с которой я сталкиваюсь, заключается в том, что даже при наличии этого загрузчика пользователь может вводить символы, поскольку пользователь уже сосредоточен на следующем поле до запуска загрузчика. Я хочу, чтобы этого не случилось.
У меня есть директива angular для элементов ввода - примерно так:
...
.directive('myCustomer', function() {
return {
restrict: 'E',
require: '?ngModel',
link: (scope, elem, attr, ngModel) => {
elem.on('blur', event => {
// some backend API call getting execute. I can get a promise back here.
let promise = getData();
}
elem.on('focus', event => {
}
}
};
});
Я хочу, чтобы поле ввода, на которое фокусируется пользователь, было отключено до тех пор, пока не будет выполнено обещание API.
Примечание: я мог бы сделать это с помощью некоторой трансляции событий и отключения / включения сфокусированного поля на основе обещания API разрешено или нет; но я чувствую, что это скорее взлом, поэтому хотел посмотреть, есть ли лучшие решения. Вот мое текущее решение -
elem.on('focus', event => {
scope.$on('UPDATE_PROGRESS', () => {
elem.attr('disabled', true);
})
scope.$on('UPDATE_COMPLETE', () => {
elem.attr('disabled', false);
})
}
И я транслирую эти события перед вызовом API, а затем.
Я использую $ ionicLoading, чтобы показать изображение прогресса при вызове api.
Оцените любые предложения по этому поводу.
Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Так что лучший способ сделать это - не делать этого вообще, потому что периодически отключать поля - это плохой пользовательский опыт.
Например, когда вы используете документы Google, они не отключают документ при каждом сохранении. Вместо этого выполняется противодействие вызову сохранения, и они выполняют новый вызов каждый раз, когда пользователь вносит изменения. Поэтому, если вызов сохранения уже выполняется, вам не нужно предотвращать выполнение дополнительных вызовов, вы просто помечаете свое состояние как «грязное», чтобы выполнить еще одно сохранение после, может быть, 1 секунды, когда пользователь не печатает.
Хм, динамическое построение формы - не такое уж безумие, но все же кажется, что вам не нужно отключать поля. Почему бы просто не разрешить пользователю редактировать его и при необходимости сделать еще один вызов? Обычный образец для вещей, которые делают частые вызовы, таких как поисковые вводы, - игнорировать результаты всех вызовов, кроме самого последнего.
Спасибо frodo2975 за ответ. К сожалению, в этом приложении я не могу отклонить эти вызовы по разным архитектурным причинам. Каждое поле ввода имеет свои собственные бизнес-сценарии и динамически обновляет / создает другие поля ввода - я знаю, это немного безумно.