1

Knockoutでカスタムバインディングハンドラーを作成しています。次のような文字列をfirstNamevalueAccessorとして渡したいので、ビューモデルから監視可能なfirstNameを取得したいのですが、Stringで監視可能な文字列を取得するにはどうすればよいですか?

これが私のコードです:

ko.bindingHandlers.DefaultOrCustom = {
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {

        var value = valueAccessor(), allBindings = allBindingsAccessor();
        // value will equal "firstName" at this phase
    } 
}
4

1 に答える 1

2

フィールド名をキーとして使用して、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実際には関数ではありませんが、このフォームを使用すると、入力内容が明確になることがよくあります。

于 2012-06-26T06:37:08.743 に答える