フィールド名をキーとして使用して、JavaScriptオブジェクトに連想配列としてアクセスできます(たとえば、object.foo
として表すことができますobject['foo']
)。次に、オブザーバブルをポイントしているときに、値を取得/設定する関数としてそれを呼び出します。
次のようなバインディングがあると仮定します。
data-bind="DefaultOrCustom: 'firstName'"
次のようにオブザーバブルにアクセスできます。
ko.bindingHandlers.DefaultOrCustom = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var value = valueAccessor(), allBindings = allBindingsAccessor();
var oldValue = viewModel[value](); // read from the observable
viewModel[value]('New Value'); // write to the observable
}
フィールドの種類を確認することで、さらに柔軟に対応できます。'function'の場合は、()形式を使用して、それを監視可能として扱います。それ以外の場合は、通常のフィールドとして扱います。
ko.bindingHandlers.DefaultOrCustom = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var value = valueAccessor(), allBindings = allBindingsAccessor();
var oldValue;
if (typeof(viewModel[value]) == 'function') {
oldValue = viewModel[value](); // read from the observable
viewModel[value]('New Value'); // write to the observable
} else {
oldValue = viewModel[value]; // read from the field
viewModel[value] = 'New Value'; // write to the field
}
}
参考:typeof
実際には関数ではありませんが、このフォームを使用すると、入力内容が明確になることがよくあります。