ここにそれをデモするための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 フィールドを離れた後、モデルがダーティであるとフラグが立てられるのはなぜですか? 値の 1 つが int ではなく null の場合、IE でのみ同じ効果があります (確認するにはメールを null に変更してください)
実際のシナリオでは、js にシリアル化された ac# オブジェクトを使用しており、手動でサブスクライブするまではすべて 100% 正常に動作しますが、これは IE でのみ発生します (現在 IE9 を実行していますが、さまざまなモード/エミュレーションでこれを試しました古いバージョンの)
どんな洞察も大歓迎です....ありがとう!