0

ドロップダウンリストにバインドされている監視可能な配列があります。ドロップダウンリストは、ASP.NET MVC Htmlヘルパーを介してページの読み込み時に入力されますが、監視可能な配列が[]に設定されているため、すべてが削除されます。ページの読み込みまたは最初の適用バインディングですべてを削除しないようにする方法はありますか?

4

1 に答える 1

1

後で監視可能な配列からオプションを設定したいようです(おそらくAJAX呼び出しから?)。Knockoutには、これを行うための組み込みの方法はありません。少なくとも3つの選択肢があるようです。

  1. 明らかな方法は、ASP.NETコードに、選択リストの代わりに監視可能な配列を入力させることです。次に、Knockoutは正しいことを行い、ドロップダウンリストにデータを入力します。

  2. バインディングをラップするカスタムバインディングを使用しますoptionsが、空の配列は無視します。

    ko.bindingHandlers.optionsNotBlank = {
        update: function (element, valueAccessor, allBindingsAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor());
            if (value.length)
                ko.bindingHandlers.options.update(element, valueAccessor, allBindingAccessor);
        }
    };
    
  3. optionsドロップダウンリストのバインディングを動的に設定します。これは公開された機能ではありませんが、エクスポートされたノックアウトメソッドを使用します。data-bind標準属性を使用する代わりに、ko.applyBindingsToNodeメソッドを使用して、監視可能な配列を入力した後にバインディングオブジェクトを渡します。ただし、1回だけ呼び出すように注意する必要がありko.applyBindingsToNodeます。

    viewModel.myArrayOfItem(newValues);
    if (!boundDropDown) {
        ko.applyBindingsToNode(document.getElementById("mydropdown"), { options: viewModel.myArrayOfItems }, viewModel);
        boundDropDown = true;
    }
    

編集:

「ダーティ」フラグを使用したコメントに基づく4番目のオプションは次のとおりです。

    ko.bindingHandlers.optionsNotBlank = {
        update: function (element, valueAccessor, allBindingsAccessor) {
            var value = ko.utils.unwrapObservable(valueAccessor()),
                isDirty = element._isDirty;
            if (isDirty || value.length) {
                element._isDirty = true;
                ko.bindingHandlers.options.update(element, valueAccessor, allBindingAccessor);
            }
        }
    };
于 2012-05-07T23:50:20.870 に答える