問題例: http://jsfiddle.net/whxD3/12/
ノックアウトには、optgroups を使用したい選択ボックスがあります。この選択ボックスは、現在の「セクション」に応じて再バインドできます。ノックがバインド順序を実行する方法が原因で、次の問題が発生することがわかりました。 :
HTML:
<div>
<a href="#" data-bind="click: page1">Section 1</a>
<a href="#" data-bind="click: page2">Section 2</a>
</div>
<hr/>
<div data-bind="with: activepage">
<select data-bind="value: selectedItem">
<optgroup label="Items">
<!-- ko foreach: items() -->
<option data-bind="value: $data, text: $data"></option>
<!-- /ko -->
</optgroup>
<optgroup label="Constants">
<option value="foo">foo</option>
</optgroup>
</select>
<br/><br/>
Selected Item: <span data-bind="text: selectedItem"></span>
</div>
JavaScript:
function SubPageViewModel(name) {
this.name = name;
this.items = ko.observableArray(["one", "two", "three"]);
this.selectedItem = ko.observable();
}
function PageViewModel() {
this.pages = [new SubPageViewModel("page1"), new SubPageViewModel("page2")];
this.activepage = ko.observable(this.pages[0]);
this.page1 = function() { this.activepage(this.pages[0]); }
this.page2 = function() { this.activepage(this.pages[1]); }
}
ko.applyBindings(new PageViewModel());
コメント foreach を使用して選択ボックスを埋めているため、アイテムが選択されていても、最初はドロップダウンのデータバインドされた選択値が null になっています。
現在のセクションから移動して戻ると、選択した値は null にリセットされます。
これは、コメント foreach が選択されたボックスを埋める前にノックアウトが選択された値をバインドしているため、その値が null に設定されているためだと思います。次に、選択ボックスが満たされると、選択した値を更新するための更新がトリガーされません。
この問題を回避するにはどうすればよいですか?