ドロップダウンリストにバインドされている監視可能な配列があります。ドロップダウンリストは、ASP.NET MVC Htmlヘルパーを介してページの読み込み時に入力されますが、監視可能な配列が[]に設定されているため、すべてが削除されます。ページの読み込みまたは最初の適用バインディングですべてを削除しないようにする方法はありますか?
質問する
1244 次
1 に答える
1
後で監視可能な配列からオプションを設定したいようです(おそらくAJAX呼び出しから?)。Knockoutには、これを行うための組み込みの方法はありません。少なくとも3つの選択肢があるようです。
明らかな方法は、ASP.NETコードに、選択リストの代わりに監視可能な配列を入力させることです。次に、Knockoutは正しいことを行い、ドロップダウンリストにデータを入力します。
バインディングをラップするカスタムバインディングを使用します
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); } };
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 に答える