删除knockout viewModel的空属性

时间:2016-01-16 16:00:35

标签: javascript c# knockout.js

事实证明,我认为这更难。我有一个ViewModel,我专门用于在网格中进行过滤。这是:

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对象。在运行方法之前,我还尝试将淘汰赛ViewModel转换为JavaScript对象(使用ko.toJS()),但我得到的结果相同。

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

1 个答案:

答案 0 :(得分:1)

我只是构造一个新的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/