Как привязка данных hasFocus knoukoutjs может работать при вводе формы текстовой области

#knockout.js

#knockout.js

Вопрос:

У меня есть простой код KnockoutJS для увеличения строк текстовой области, когда текстовая область имеет фокус.

     <div class='liveExample'> 
       <input type="text" value="" />
       <textarea data-bind="hasFocus: $root.applyIncreaseCols,  attr: { rows : 
     lines }"> </textarea>

       </div>
  
 var myModel = function() {

    this.lines=ko.observable("1");

    this.applyIncreaseCols = function(){
    //document.getElementById("thisone").cols="100";

    //alert("damn right");
     this.lines("3");

    };


 }

ko.applyBindings(new myModel());
  

Ответ №1:

Вы могли бы подписаться на наблюдаемую привязку к атрибуту hasFocus и переключить количество строк / rows здесь?

Я добавил простое и немного более продвинутое решение, первое в основном делает то, что вы искали.

Второй суммирует все разрывы строк в своем содержимом и использует это для определения требуемого количества строк 1. Вы могли бы проверить минимальное и максимальное значения и, возможно, иметь немного менее прыгающую форму, по крайней мере, с более естественным ощущением.

 var myModel = function() {
  //to make sure we're working against the myModel scope
  var self = this; 
  
  // simple expanding textarea
  self.lines = ko.observable(1);
  self.isFocus = ko.observable(false);
  self.isFocus.subscribe(function(isFocus) {
    self.lines(isFocus ? 3 : 1);
  });
  
  // expanding textarea by amount linebreaks   1
  self.lines2 = ko.observable(2);
  self.content2 = ko.observable('');
  self.content2.subscribe(function (content2) {
    var linebreaks = content2.split(/rn|r|n/).length;
    self.lines2(linebreaks   1);
  });
}

ko.applyBindings(new myModel());  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div class='liveExample'>
  simple:
  <textarea data-bind="hasFocus: isFocus, attr: { rows: lines }"> </textarea>
  <br />
  advanced:
  <textarea data-bind="attr: { rows: lines2 }, textInput: content2"> </textarea>
</div>