Используя угловую директиву, я пытаюсь создать вертикально расширяемую текстовую область, которая имеет такое же количество строк, что и число символов "\n" в тексте.
(Заметьте, я знаю, что это не сработает для обертывания строк - я буду иметь дело с этим отдельно).
app.directive('textExpand', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elem, attrs, ngModel) {
RecalculateLines();
function RecalculateLines() {
scope.textEntry = "line1\nline2\n\nline3";
angular.element(elem).attr("rows", (scope.textEntry).split("\n").length);
}
elem.on('keydown', function(event) {
RecalculateLines();
});
}
};
});
Идея состоит в том, что у меня есть функция для постоянного пересчета количества разрывов строк и динамического обновления количества строк с помощью углового jqLite для установки атрибута. Я вызываю эту функцию один раз в начале (для отображения любых ранее существующих значений), а затем один раз при каждом нажатии клавиши.
(scope.textEntry).split("\n").length
правильно подсчитывается при загрузке жестко заданного значения и обновляется при вводе в поле. Однако установка его с использованием.attr(), похоже, работает только на начальный вызов, а не на нажатия клавиш.
Что странно, что .attr()
похоже, отлично работает, передавая ему другое число. См. Код с комментариями в панели, где поле расширяется и сжимается штрафом на основе счетчика на каждое нажатие клавиши.
Что мне не хватает?
Вы сбросили переменную области видимости в строке, которая проверяла ее, переместив ее из функции и добавив ng-trim="false"
исправляет проблему.
http://plnkr.co/edit/W0g1PupXYTUgiNLK1D8M?p=preview
function RecalculateLines() {
angular.element(elem).attr("rows", (scope.textEntry).split(/\r?\n/g).length);
// angular.element(elem).attr("rows", rowCount);
}