这是一个演示它的jsfiddle ...
dirtyFlag = function(root) {
var _isDirty = ko.observable(false);
root.isFilthy = function() {
return _isDirty();
};
var result = ko.computed(function() {
if (!_isDirty()) {
ko.toJS(root);
}
return _isDirty();
});
result.subscribe(function() {
if (!_isDirty()) {
_isDirty(true);
alert('dirty!');
}
});
return result;
};
var viewModel = {
dataObject: ko.observable()
};
var data = {
"UserName": "TheName",
"UserID": 2,
"Notes": "Yeah!",
"email": "booya@test.x"
};
viewModel.dataObject = ko.mapping.fromJS(data);
dirtyFlag(viewModel.dataObject);
ko.applyBindings(viewModel);
如果您查看数据模型,UserID 是一个 int,模型上有一个订阅,以便在发生更改时设置一个“脏”标志,并且我抛出了一个警报,以便您确切地知道它何时被标记为这样。
输入包含 id 的输入字段,不要输入,不要更改它,只需单击下一个框或选项卡即可。
如果您使用 Firefox、Chrome 等访问这个小提琴,那么它的行为与您预期的一样,没有任何反应。
现在用 IE 访问它,为什么离开 UserID 字段后它会将模型标记为脏?如果其中一个值为 null 而不是 int,则仅在 IE 中具有相同效果(将电子邮件更改为 null 以查看)
在实际场景中,我使用已序列化为 js 的 ac# 对象,并且所有工作都 100% 正常,直到我手动订阅,并且这仅在 IE 中发生(当前运行 IE9,但在各种模式/仿真下尝试过)旧版本)
任何见解将不胜感激......谢谢!