これが私のサンプルデータです。これは、JSON 形式の構成でフォーム サーバーを以下のオブジェクト グラフにロードします。「Choice」オブジェクトの配列で、それぞれにid、name、stages、currentStageIdプロパティがあります。「 Choice」オブジェクトの「stages」プロパティは、 id、name、および valueプロパティを持つ「Stage」オブジェクトの配列です。「Choice」オブジェクトは、「First Stage」から「Fourth Stage」までの no.of ステージを通過します。ユーザーはドロップダウンリストから「ステージ」を選択して保存できます。「currentStageId」は「id」を格納するプロパティです
注: 各選択肢には、簡潔にするためにさまざまなタイプのステージを含めることができます。
つまり、選択肢 1 の場合、現在保存されているステージは 4 です。
var data = [
new Choice({
id: 1,
name: "One",
stages: [
new Stage({
id: 1,
name: "First Stage",
value: 25
}),
new Stage({
id: 2,
name: "Second Stage",
value: 50
}),
new Stage({
id: 3,
name: "Third Stage",
value: 75
}),
new Stage({
id: 4,
name: "Fourth Stage",
value: 100
})],
currentStageId: 4
}),
new Choice({
id: 2,
name: "Two",
stages: [
new Stage({
id: 1,
name: "First Stage",
value: 25
}),
new Stage({
id: 2,
name: "Second Stage",
value: 50
}),
new Stage({
id: 3,
name: "Third Stage",
value: 75
}),
new Stage({
id: 4,
name: "Fourth Stage",
value: 100
})],
currentStageId: 3
}),
new Choice({
id: 3,
name: "Three",
stages: [
new Stage({
id: 1,
name: "First Stage",
value: 25
}),
new Stage({
id: 2,
name: "Second Stage",
value: 50
}),
new Stage({
id: 3,
name: "Third Stage",
value: 75
}),
new Stage({
id: 4,
name: "Fourth Stage",
value: 100
})],
currentStageId: 2
})];
データを保持する「Choice」および「Stage」 Modlesとバインド用のViewModelは次のとおりです。
function ViewModel(data) {
var self = this;
self.choices = ko.observableArray(data);
//dont require pre selection so kept it with empty observable so it
//will be set to first item in the dropdown list
self.selectedChoice = ko.observable();
}
function Choice(data) {
//debugger;
this.id = data.id;
this.name = data.name;
//require pre selection of stage as choice can go through no of
//stages and selected stage name and value will be stored
this.selectedStage = ko.observable(ko.utils.arrayFirst(data.stages, function (item) {
return item.id === data.currentStageId;
}));
this.stages = ko.observableArray(data.stages);
}
function Stage(data) {
this.id = data.id;
this.name = data.name;
this.value = data.value;
}
ko.applyBindings(new ViewModel(data));
これが私の見解です
<select data-bind="options: choices, optionsText: 'name', value: selectedChoice"></select>
<select data-bind="options: selectedChoice().stages, optionsText: 'name', value: selectedChoice().selectedStage"></select>
Knockout.js 2x バージョン
- 保存されたステージの事前選択が機能しています
- 選択のために選択されたステージは、基礎となるオブザーバブルに更新されます
これはjsでKO 2xを使用した作業サンプルです
Knockout.js 3x バージョン
- 保存されたステージの事前選択が機能しない
- 選択肢として選択されたステージは保持されません。選択が変更されると、選択が変更されるたびに、selectedStage がドロップダウン リストの最初の項目に設定されます。
最後に実際の部分。質問!
- 2 つの異なるバージョンの KO で同じコードの動作が異なるのはなぜですか。KO で何か新しいものを見逃していますか? それともKOのバグですか?
- 最新バージョンの KO を使用して、新しいバージョンの KO と同じ機能を実現するには、どのようなコード変更を行う必要がありますか? 私のプロジェクトは最新バージョンの konckout.js 3.1.0 で開発されており、この機能のために古いバージョンに戻したくありません。
- 2x と 3x のどちらの KO バージョンの動作が正しいですか? 内部で何が起こっているのですか?この動作の不一致を引き起こしているのはどれですか?
前もって感謝します。