может ли обнаружение углового изменения переписать текстовое выделение?

97
5

Я использую угловой (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. но я не знаю, насколько достаточно внутреннего угла, чтобы быть уверенным.

спросил(а) 2018-07-06T23:20:00+03:00 2 года, 2 месяца назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема