【问题标题】:Remove empty properties of knockout viewModel删除淘汰视图模型的空属性
【发布时间】:2016-04-22 02:32:34
【问题描述】:

事实证明,这比我想象的要难。我有一个专门用于在我的网格中过滤的 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()),但我得到了相同的结果。

我在这里做错了什么,我该如何做对?

【问题讨论】:

    标签: javascript c# knockout.js


    【解决方案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/

    【讨论】:

    • 另外请注意,您并没有使用括号取消可观察检查的装箱...因此,在检查 self[property] 时,您将在原始代码中返回原始函数对象。应该是 self[property]()。可能是你痛苦的根源。
    • 括号不是我痛苦的根源,但没关系,您的解决方案效果很好!
    猜你喜欢
    • 2013-02-28
    • 2012-03-06
    • 1970-01-01
    • 2017-12-10
    • 2015-07-27
    • 1970-01-01
    • 2013-01-15
    • 2013-07-08
    • 2012-11-09
    相关资源
    最近更新 更多