このリンクにある以下の protectedObservable カスタム バインディングの使用に問題があります。
http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel-edits.html
保護されたオブザーバブルは、3 つの子テンプレート内にネストされています。
<select class="select-teams bracket-select" data-bind="value: divisionTeamId, options: $root.teams, optionsText: 'Name', optionsValue: 'Id', optionsCaption: ' - Teams - '"></select>
これが保護されたオブザーバブルでない場合、ビューモデルはそれ自体を再レンダリングしません。保護されている場合、テンプレートは再レンダリングされ、初期値が失われます。なぜこれが起こっているのか手がかりはありますか?
self.divisionTeamId = ko.protectedObservable(undefined);
カスタムバインディング
ko.protectedObservable = function (initialValue) {
var _actualValue = ko.observable(initialValue),
_tempValue = initialValue;
var result = ko.computed({
read: function () {
return _actualValue();
},
write: function (newValue) {
_tempValue = newValue;
}
});
result.commit = function () {
if (_tempValue !== _actualValue()) {
_actualValue(_tempValue);
}
};
result.reset = function () {
_actualValue.valueHasMutated();
_tempValue = _actualValue();
};
return result;
};
アップデート
stopBinding を削除すると問題が解決することがわかりました。
<div data-bind="stopBinding: true">
<div id="bracket-namespace">
.....
</div>
</div>
app.members.bracket.init = function (options) {
viewModel = new ViewModel(options);
ko.applyBindings(viewModel, document.getElementById("bracket-namespace"));
};
ko.bindingHandlers.stopBinding = {
init: function () {
return { controlsDescendantBindings: true };
}
};