Knockout mapping用于ko.mapping.toJSON()的选项-方法

Knockout mappingOptions for ko.mapping.toJSON()-method

本文关键字:mapping 选项 -方法 toJSON 用于 ko Knockout      更新时间:2023-10-09

问题

我正在尝试将修改后的viewModel发送回我的服务器。不幸的是,我不得不使用ko.mapping.fromJSON()和一些mappingOptions创建我的viewModel,这很好。现在,我需要一种简单的方法将创建的viewModel转换回原始方案。

期望的结果

我想转换这个:

var myModel = {
    simpleProp: "test",
    complexProp: {
        simpleProp2: "test2",
        simpleProp3: "test3"
    }
};

转换为(JS):

var myModel = {
    simpleProp: "test",
    modifiedToSimpleProWithNewName: "test2"
};

给我这个JSON:

{"simpleProp":"test","modifiedToSimplePropWithNewName": "test2"}

尝试

我在想,由于ko.mapping.toJSON有一个映射参数,因此为该方法创建另一个映射非常容易。但看起来ko.mapping实际上忽略了我的自定义属性创建:

var mappingOptions = {
    // ignored
    'simpleProp': {
        create: function (thing) {
            return "Changed simpleProps value";
        }
    },
    // working
    ignore: ["simpleProp3"]
};

进一步信息

我为您创建了一个jsFiddle。

请注意:我已经简化了使用fromJSON:删除模型生成的示例

// created and modified by ko.mapping.fromJSON - with custom mapping!
var myModel = {
    simpleProp: "test",
    complexProp: {
        simpleProp2: "test2",
        simpleProp3: "test3"
    }
};

结果将是:

{"simpleProp":"test","complexProp":{"simpleProp2":"test2"}}

正如您所看到的,忽略选项将被应用,而的"简单抢劫"/create则不会。

非常感谢您的帮助。非常感谢。

附言:我知道这种映射不会达到预期的结果。这只是一个"‘impleDrop’会被修改吗?"-测试。

映射插件toJSON方法将像JSON.stringify函数一样,在将对象字符串化为JSON之前,检查并使用对象上可能存在的任何toJSON方法的返回值。

因此,你可以这样做(更新的jsfiddle):

var myModel = {
    simpleProp: "test",
    complexProp: {
        simpleProp2: "test2",
        simpleProp3: "test3"
    },
    toJSON: function () {
        return {
            simpleProp: this.simpleProp,
            complexProp: this.complexProp.simpleProp2
        };
    }
};

只要让toJSON方法按照您希望的方式格式化对象,就可以了。