input
にバインドされたノックアウトオブザーバブルでイベントを実行したい。この関数は、コントロールがフォーカスを失ったときに、何も入力しなくても実行する必要があります。イベントバインディングを変更しようとしましたが、ユーザーが何も入力せずにコントロールから離れたときに起動しません。 mouseoutイベントを試しましたが、ユーザーがフォーカスを失った後、フォームの別の場所をクリックしたときにのみ発生します。タブを使用しても、フォーカスがコントロールから離れるとすぐにイベントが発生します。
以下は、mouseoutイベントに使用したコードです。
<input
type="text"
id="txtFirstName"
tabindex="1"
maxlength="25"
class="txtbox"
style="width: 200px;"
data-bind="value: FirstName,
attr: {title: FirstNameErrorMessage },
css: {validationFailed: !IsValidFirstName() },
event: {mouseout: ValidateFirstName}"
/>
this.ValidateFirstName = function () {
self.IsValidFirstName(true);
self.FirstNameErrorMessage('');
if (self.FirstName() == '') {
self.IsValidFirstName(false);
self.FirstNameErrorMessage('First Name is required');
}
}
誰でも助けてくれますか?
使用できるアプローチはいくつかあると思います。素晴らしいオプションは、KOのhasfocus
バインディングを使用することです: http://knockoutjs.com/documentation/hasfocus-binding.html 。
ブール値のオブザーバブルに対してバインドし、サブスクライブできます。サブスクリプションでは、値がfalseになったときにのみ反応するように選択できます。
何かのようなもの:
self.FirstName = ko.observable();
self.FirstName.focused = ko.observable();
self.FirstName.focused.subscribe(function(newValue) {
if (!newValue) {
//do validation logic here and set any validation observables as necessary
}
});
次のようにバインドします:
data-bind="value: FirstName, hasfocus: FirstName.focused"
ユーザーがフィールドを離れるたびに、実際に変更が行われたかどうかに関係なく、ユーザーがフィールドを離れるたびに起動するようにしたい場合、これは良いオプションだと思います。
@RPNiemeyerの回答が好きです。ただし、すべてをKnockout経由で行う必要はないことを指摘したかっただけです。それは単なるツールであり、時にはそれは仕事に最適なツールではありません。あなたはいつもJSでやっているように、常に直接イベントバインディングを使用します、つまり.
$('#FirstName').on('blur', function () {
// do something
});
そこで実際にビューモデルとやり取りする必要がある場合は、単にko.dataFor
イベントの委任に関するノックアウトのドキュメント :
$('#FirstName').on('blur', function () {
var data = ko.dataFor(this);
// do something with data, i.e. data.FirstName()
});
これは私のために働いた:
data-bind="event: { blur: OnBlurEvent }"
私は同じ問題を抱えていたので、カスタムバインディングを作成して解決しました。
ko.bindingHandlers.modifyOnFocusOut = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
$(element).blur(function() {
//Do your work
});
}
}
そして、次のように呼び出します:
data-bind="value: FirstName, modifyOnFocusOut: FirstName"
やってみました event:{blur: ValidateFirstName}
このイベントは、ユーザーが入力をクリックするか「入力」した場合に発生します。
<input
type="text"
id="txtFirstName"
tabindex="1"
maxlength="25"
class="txtbox"
style="width: 200px;"
data-bind="value: FirstName,
attr: {title: FirstNameErrorMessage},
css: {validationFailed: !IsValidFirstName()},
event: {blur: ValidateFirstName}"
以下に、実例の JSFiddle を示します。
TypeScriptを使用して、SetFocusBindingとOnBlur Bindingという2つのカスタムバインディングを使用して解決しました... SetFocusBindingを使用して、入力フィールドにフォーカスがあることを確認します。 OnBlurバインディングを使用すると、blurイベントがトリガーされたときに関数が呼び出されます。
module Fx.Ko.Bindings {
export class SetFocusBinding implements KnockoutBindingHandler {
public update(element, valueAccessor, allBindingsAccessor) {
var value = valueAccessor();
var valueUnwrapped = ko.unwrap(value);
if (valueUnwrapped == undefined) {
return;
}
if (valueUnwrapped)
$(element).focus();
}
}
}
そして...
module Fx.Ko.Bindings {
export class OnBlurBinding implements KnockoutBindingHandler {
public init(element, valueAccessor, allBindings, viewModel, bindingContext) {
var value = valueAccessor();
$(element).on('blur', function (event) {
value();
});
}
}
}
interface KnockoutBindingHandlers {
onBlur: KnockoutBindingHandler;
}
ko.bindingHandlers.onBlur = new Fx.Ko.Bindings.OnBlurBinding();