删除挖空视图模型的空属性

本文关键字:属性 模型 视图 删除 | 更新日期: 2023-09-27 18:30:36

事实证明,这比我想象的要难。我有一个视图模型,专门用于在我的网格中进行过滤。在这里:

var GridFiltersViewModel = function () {
    var self = this;
    self.search = ko.observable();
    self.sortColumn = ko.observable();
    self.sortDirectionIsAscending = ko.observable(true);
    self.page = ko.observable(1);
    self.pageSize = ko.observable(10);
    self.pageCount = ko.observable();
    self.itemCount = ko.observable();
};

我面临的问题是,当我将此 ViewModel 的实例发送到我的操作方法时,出现错误:

值"null"对属性无效

发生这种情况是因为我的服务器端 ViewModel 属性不接受客户端 ViewModel 的nullundefined属性,即使我将它们设置为可为空也是如此。让服务器端 ViewModel 接受空属性的唯一方法是根本不发送它们。这是我的尝试:

var GridFiltersViewModel = function () {
    // the properties from before
    self.removeEmptyProperties = function () {
        for (var property in self) {
            if (self[property] === null || self[property] === undefined) {
                delete self[property];
            }
        }
    };
};

可以说,它不起作用。目前,当该方法完成时,我只是得到一个undefined对象。在运行该方法之前,我还尝试将挖空视图模型转换为JavaScript对象(使用ko.toJS()),但我得到了相同的结果。

在这里做错了什么,我怎么做对?

删除挖空视图模型的空属性

我只会构造一个新的 JSON 对象并返回它,而不是尝试一些奇特的东西,比如删除属性......像这样:

 var GridFiltersViewModel = function () {
    var self = this;
    self.prop1 = ko.observable(null);
    self.prop2 = ko.observable('Test');
    self.prop3 = ko.observable(undefined);
    self.definedProperties = ko.computed(function () {
        var json = {};
        json.props = "";
        for (var property in self) {
            if (self[property]() !== null && self[property]() !== undefined) {
                json[property] = self[property]();
                if (json.props !== "") {
                  json.props += ", ";                   
                }
                json.props += property;
            }
        }
        return json;
    });    
};

完整示例如下:https://jsfiddle.net/brettwgreen/ehy7cmud/2/