現在、dom 要素の jQuery データを使用して状態を保存しています。
ko.bindingHandlers.customValue = {
init: function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var state = { isEditing: false };
$(element).focus(function focus() {
state.isEditing = true;
}).blur(function blur() {
state.isEditing = false;
}).data("customBinding", state);
},
update: function update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// ignore if updating
if (!$(element).data("customBinding").isEditing) {
// handle update if they are not updating
}
}
};
DOM を必要とせず、バインディングごとに状態を保存するのに適した場所はありますか? bindingContext を使用して、バインディングの各インスタンスの状態を保存できますか?
ベストアンサー1
はbindingContext
可能ですが、バインディングが最初にトリガーされたときに から にデータを渡す場合のみです。 が次に起動されるときには、init
バインディングは存在しなくなります。update
update
このタイプの状態を保存する場所には、実際には 2 つの選択肢があります。
1- 要素上で、あなたが述べたように。$.data
これを行うには、jQuery または KO include API を使用することko.utils.domData.get(element, key)
もできますko.utils.domData.set(element, key, value)
。
2- 適切な場合は、このタイプの情報をビュー モデルに配置します。フラグは、isEditing
ビュー モデルでは必ずしも場違いではありません。個人的には、このタイプの「メタデータ」を、次のように、オブザーバブルのサブオブザーバブルとして配置するのが好きです。
var name = ko.observable("Bob");
name.isEditing = ko.observable(false);
name
およびに対してバインドできるようになりますname.isEditing
。
これにはいくつかの利点があります:
- 新しいトップレベルのプロパティを導入しないので、ビューモデルをかなりクリーンに保つことができます。
- サブオブザーバブルをその親オブザーバブルに結び付けたままにします(
nameIsEditing
などは必要ありません) ko.toJSON
サブオブザーバブルのようなものを JSON に変換すると、isEditing
親がラップ解除されたときにサブオブザーバブルは単純に削除されます。そのため、不要な値がサーバーに返されることはありません。- この場合、ビュー モデル内の他の計算に使用したり、UI 内の複数の要素にバインドしたりできるという利点もあります。