1

ここにそれをデモするための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 を実行していますが、さまざまなモード/エミュレーションでこれを試しました古いバージョンの)

どんな洞察も大歓迎です....ありがとう!

4

0 に答える 0