这是jsfiddle to demo it ...
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(将电子邮件更改为null以查看),则仅在IE中具有相同的效果
在真实场景中,我正在使用已经序列化为js的ac#对象,并且所有这些都可以100%正常工作,直到我手动订阅,并且这只会在IE中发生(目前正在运行IE9但在各种情况下尝试过旧版本的模式/仿真)
非常感谢任何见解......谢谢!