2017-02-17 12 views
3

私は、keyupイベントのテキストエリアの高さを自動拡張するロジックを実装しました。しかし、ノックアウトカスタムバインディングを介して値がテキストエリアにバインドされると、そのテキストエリアの高さを初期化します。どんな解決策ですか? (jQueryのまたは任意の他のライブラリを使用せず、唯一のKnockoutJSを使用することにより)ノックアウトjsを使ってテキストエリアを自動拡張する

答えて

3

イベントを使用してサイズ変更をトリガーすることについて強くお勧めします。代わりに、textInputバインディングを使用して、オブザーバブルの入力を追跡し、その変更をサブスクライブすることができます。

はここでの例です:結合が観察value変数に任意の入力変更を書き込み

  • textInput:これは動作します

    <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); 
        }) 
        } 
    }; 
    

  • computedは、この値を使用してサイズ変更をトリガーします。これにより、自動的に購読が作成されます。

それは同様event同等を示すRight Mouse Button > cut

例のようなものを扱うので、これは​​アプローチよりも優れている:

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()を適用することカスタムバインディングを作成することができます

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.value.length'''と '' 'textarea.rows''を比較する必要があります – dpix

関連する問題