我在使用以下链接中的 protectedObservable 自定义绑定时遇到问题。
http://www.knockmeout.net/2011/03/guard-your-model-accept-or-cancel-edits.html
受保护的 observable 嵌套在 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 };
}
};