ノックアウト js を使用して遅延読み込み選択を作成しようとしています。ノックアウトのおかげで、オンデマンドでデータを読み込んで UI を更新するのは簡単です。ただし、データがロードされると、正しいアイテムを設定することに問題があります。
jsFiddle の例はこちら
少し掘り下げた後、ノックアウトはモデルをオプションに一致させたいため、値をオーバーライドするようです。knockout-2.2.1.debug.js の「ensureDropdownSelectionIsConsistentWithModelValue」を参照してください。
これを行う時点でオプションがないため、モデル値を0で上書きするため、これは私にとって問題です。
私はノックアウトにかなり慣れていないので、私はこれに間違ったアプローチをしていると思います...誰かがこれを達成しましたか? または提案するより良いアプローチがありますか?
Ryan のブログ記事Lazy Loading an Observable in KnockoutJSを読みましたが、私の問題を解決する彼のアプローチを活用する方法がわかりません。
助けてくれてありがとう:)
ステ。
コードサンプル:
HTML:
<select data-bind="options: $data.choice.options, optionsText: 'text', optionsValue: 'value', value: $data.choice"></select>
JS:
var optionsProvider = (function () {
"use strict";
var self = {};
//container for options data, a sort of dictionary of option arrays.
self.options = {};
self.init = function (optionData) {
//pre-populate any provided options data here...
};
self.get = function(name) {
if (!self.options[name]) {
self.options[name] = ko.observable([]);
//ajax request for options
//populate self.options[name] with options upon return
//dummy this with below for example.
setTimeout(function() {
self.options[name]([
{ text : "option1", value : 1 },
{ text : "option2", value : 2 },
{ text : "option3", value : 3 },
]);
}, 1000); //simulate some delay
}
//return reference to observable immediately.
return self.options[name];
};
return self;
})();
var simpleModel = function() {
this.choice = ko.observable(2); //hard code selected option to simulated pre-saved selection.
this.choice.options = optionsProvider.get("SomeOptionType");
};
ko.applyBindings(new simpleModel());