Я делаю директиву, которая будет блокировать рендеринг на входе, пока он сфокусирован.
Вариант использования заключается в том, что мы получаем частые оперативные обновления от бэкэнда, и он перезаписывает все, что пользователь пишет на входе, из-за привязки ng-model. Мы отправляем обновление при нажатии на ввод с помощью ng-keydown="($event.keyCode === 13) ? $ctrl.setItem($event, $ctrl.item) : return"
, где $ctrl.setItem отправит запрос на серверную часть.
Я почти заставил его работать так, как я этого хочу, только я получаю удивительные результаты, когда размываю ввод после редактирования.
Я сделал планкер, в котором имитирую обновления серверной части, используя $interval: https://plnkr.co/edit/XNFA3bQtbGliAhS0uVmP?p=preview
app.directive('noUpdatesWhenFocused', function() {
return {
restrict: 'A',
require: '?ngModel',
link: function(scope, element, attrs, ngModel) {
if (!ngModel || element[0].type !== 'text') {
return;
}
var hasFocus = false;
element.on('focus', function() {
hasFocus = true;
});
element.on('blur', function() {
hasFocus = false;
ngModel.$render();
});
ngModel.$render = function() {
if (!hasFocus) {
element.val(ngModel.$viewValue);
}
};
}
};
});
Если вы размоете после редактирования в первом поле ввода и подождите несколько секунд для нового «обновления», то модель вернется к состоянию последнего редактирования вида, а не к последнему обновлению модели. Мы всегда хотим показывать последнее обновление из бэкенда, так что это то, что мне нужно исправить, но я в тупике.