2017-03-08 20 views
1

ユーザーが選択を完了し、ブートストラップマルチセレクトドロップダウンから離れた後にロジックを実行しようとしています。ブートストラップマルチセレクションブラーイベントがトリガーされない

私はblurイベントをフックしようとした:

onBlur: function(){ 
    alert('OnBlur'); 
} 

しかし、それはキックなかっインを決して:

私のViewModelにonBlurイベント機能を定義
 <select id="select1" multiple="multiple" class="form-control" data-bind="options: availableValues, selectedOptions: selectedValues, multiselect: { 
    includeSelectAllOption: true 
    }, event: { blur: $root.onBlur}"> 
     </select> 

。私は$root.onBlur、ただblur: onBlurのせずに直接イベントバインディングを設定しようとしましたが、うまくいきませんでした。ここで

は、サンプルJSフィドルです:

https://jsfiddle.net/gtzatrL2/

私は何かが足りないのですか?またはブートストラップマルチ選択に適用されないブラーイベントですか?

私がぼかしをかけたいのは、すべての項目が選択された後にAjaxを実行するバックエンドロジックがあるからです。 observableArrayの変更を購読すると、追加したアイテムごとにバックエンドコールが発生しますが、これは私が望むものではありません。

+1

ブートストラップは、実際には、元のselect要素を隠し、その場所にdiv要素を示し、その選択にぼかしがヒットれることは決してありませんされています。ブートストラップコントロールを使用したい場合は、元のselectの代わりにbootstrapを作成する要素にイベントをアタッチするカスタムバインディングが必要になるでしょう。 –

+0

実際、私は、あなたが既に、http://github.com/davidstutz/bootstrap-multiselectでブートストラップマルチセレクションプロジェクトを使って、それを正確に行っているのを見ています。残念ながら、彼のバインディングハンドラはBlurをサポートしていないようです。サポートを追加するよう頼んだり、jsファイルからハンドラーをコピーして自分自身で修正して、ブラーイベントのサポートを追加することもできます。 –

答えて

1

ブートストラップは、実際に元を隠しています要素を選択してその場所にdivを表示するので、最初の場所にフォーカスされていないため、選択範囲のぼかしは一度もヒットしません。

divを使用しているため、divが通常フォーカスできないため、ぼかしをサポートすることができない可能性があります。いくつかの回避策がありますが、この特定のケースでは機能しない可能性があります。 How to blur the div element?

オプションを選択するたびにサブスクリプションが即座に発生しないようにobservableArrayをレート制限することができます。これにより、バックエンドコールも削減されますが、ユーザーが終了する前に起動しないことは保証されません。

http://knockoutjs.com/documentation/rateLimit-observable.html

this.selectedValues = ko.observableArray().extend({ rateLimit: { timeout: 500, method: "notifyWhenChangesStop" } }); 

this.selectedValues.subscribe(function() { 
    alert("BLUR: " + this.selectedValues().length + " elements selected"); 
}); 
+0

これは素晴らしいです。推薦してくれてありがとう!サーバーは現在ただ1つのコールを受信して​​います –

0

ここで作業例だ - ユーザーのタブ "離れて第二の入力にblurイベントコールバックが表示され、多くの要素が選択されたどのようにするとき

var ViewModel = function() { 
 
    this.availableValues = ko.observableArray(["Option A", "Option B", "Option C"]); 
 
    this.selectedValues = ko.observableArray(); 
 

 
    this.onBlur = function() { 
 
     alert("BLUR: " + this.selectedValues().length + " elements selected"); 
 
    } 
 
}; 
 

 
ko.applyBindings(new ViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<select id="select1" multiple="multiple" class="form-control" data-bind="options: availableValues, selectedOptions: selectedValues, multiselect: { includeSelectAllOption: true },event: { blur: $root.onBlur}"> 
 

 
<input type="text">

+0

私はそれを取得しません。私のコードとは何が違うのですか? –

+0

違いは、このスニペットはブートストラップを使用していません –

+0

それは本当です - 使用されている追加のプラグインがあることに気付かなかった。 Jason Spakeが示唆しているように、最良のアプローチはカスタムバインディングです。 –

関連する問題