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 字段后它会将模型标记为脏?如果其中一个值为 null 而不是 int,则仅在 IE 中具有相同效果(将电子邮件更改为 null 以查看)

在实际场景中,我使用已序列化为 js 的 ac# 对象,并且所有工作都 100% 正常,直到我手动订阅,并且这仅在 IE 中发生(当前运行 IE9,但在各种模式/仿真下尝试过)旧版本)

任何见解将不胜感激......谢谢!

4

0 回答 0