может ли обнаружение углового изменения переписать текстовое выделение?
Я использую угловой (6x) с текстовым полем, чтобы воссоздать небольшой редактор JSON.
Я перепрограммировал "CTRL" + "shift" + "стрелка вверх/вниз" для перемещения строки вверх и вниз, как это возможно в другом текстовом редакторе рабочего стола.
Я должен пересчитывать каждый раз при выбореStart и selectionEnd, чтобы выбор сохранял это "относительное" место. Я все это понял, но обнаружил, что "selectionDirection" заменяется асинхронно на "вперед".
Короче говоря, моя функция выглядит так:
function onKeyDown(event) {
//save starting direction
const direction = event.target.selectionDirection;
//... my magic to find the newString + newSelectionStart + newSelectionEnd. ...
this.jsonString = event.target.value = newString;
event.target.selectionStart = newSelectionStart;
event.target.selectionEnd = newSelectionEnd;
event.target.selectionDirection = direction;
}
и мой шаблон выглядит так:
<textarea
[value]="jsonString"
(input)="jsonString = $event.target.value"
(keydown)="onKeydown($event)"></textarea>
он работает, но selectionDirection изменяется после выполнения функции. Я знаю, что он настроен назад вперед в макрозадаче (через setTimeout), поскольку установка его обратно в обещание (микрозадача) не работает, и установка его обратно в setTimeout создает ошибку состояния гонки. ex:
//in place of the last line of the function. do nothing.
Promise.resolve().then(() => {event.target.selectionDirection = direction;})
//in place if the last line of the function. do a race condition. it work, but it 'fickle',
//changing from "backward" to "forward" to "backard" each time.
setTimeout(() => {event.target.selectionDirection = direction;});
Почему selectionDirection
изменен назад? selectionStart
и selectionEnd
не меняются, только selectionDirection
.
только думаю, что я могу думать о том, что Угловое обнаружение изменения mechanisme заменить значение текстового поля по значению jsonString, и при этом, он вручную сохранить selectionStart
и selectionEnd
, но не selectionDirection
. но я не знаю, насколько достаточно внутреннего угла, чтобы быть уверенным.