2017-02-17 125 views
3

我已经实现了在keyup事件中自动扩展textarea高度的逻辑。但是,我希望textarea在通过敲除自定义绑定将值绑定到textarea时也初始化它的高度。任何解决方案自动增长textarea与淘汰赛js

回答

3

我强烈建议不要使用事件触发调整大小。相反,您可以使用textInput绑定来跟踪observable中的输入并订阅其中的更改。

下面是一个例子:

<textarea data-bind="textInput: value, autoResize: value"></textarea> 
ko.bindingHandlers.autoResize = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
    ko.computed(function() { 
     ko.unwrap(valueAccessor()); 
     resizeToFitContent(element); 
    }) 
    } 
}; 

这样做是因为:

  • textInput结合写入任何输入变化到可观察到的value变量。
  • computed使用此值触发调整大小。这会自动创建订阅。

这比​​方法更好,因为它用的东西涉及像Right Mouse Button > cut

范例显示了event相当于以及:

var resizeToFitContent = function(el) { 
 
    // http://stackoverflow.com/a/995374/3297291 
 
    el.style.height = "1px"; 
 
    el.style.height = el.scrollHeight + "px"; 
 
} 
 

 

 
ko.bindingHandlers.autoResize = { 
 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
 
    ko.computed(function() { 
 
     ko.unwrap(valueAccessor()); 
 
     resizeToFitContent(element); 
 
    }) 
 
    } 
 
}; 
 

 
ko.applyBindings({ 
 
    value: ko.observable("Test"), 
 
    
 
    onKey: function(data, event) { 
 
    \t resizeToFitContent(event.target); 
 
    } 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<textarea data-bind="textInput: value, autoResize: value"></textarea> 
 
<textarea data-bind="event: { keyup: onKey }"></textarea>

0

您可以创建自定义的绑定将应用于autoresize()所有文字区域(仅利用KnockoutJS的,不使用jQuery或任何其他库):

ko.bindingHandlers.jqAutoresize = { 
    init: function(element, valueAccessor) { 
     var options = ko.utils.unwrapObservable(valueAccessor()) || {}; 

     $(element).autoResize(options); 
    } 
}; 

更新您的看法是这样的:

<div data-bind="foreach: Rows" > 
    <textarea data-bind="jqAutoresize: {}, value: RowText" ></textarea> 
</div> 
+0

谢谢你这么多的回复我的问题,我是新来淘汰js。它不工作,如何在autoresize()上创建自定义绑定?请介意,如果你可以在JSFiddle中设置它,请问? – user2235768

+0

如果它帮助然后提高速度,谢谢 –

+0

使用绑定处理程序绝对是在淘汰赛中做到这一点。要真正检查文本区域是否需要调整大小,您需要获取文本区域的值并检查字符串的长度。那么你可能需要做出明智的决定,何时增加textarea的大小。基本上你需要比较'''textarea.value.length'''''textarea.rows''' – dpix