ko.mapping.toJSON()方法的Knockout mappingOptions

CKE*_*CKE 4 javascript knockout-mapping-plugin knockout.js

问题

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

期望的结果

我想转换这个:

var myModel = {
    simpleProp: "test",
    complexProp: {
        simpleProp2: "test2",
        simpleProp3: "test3"
    }
};
Run Code Online (Sandbox Code Playgroud)

进入(JS):

var myModel = {
    simpleProp: "test",
    modifiedToSimpleProWithNewName: "test2"
};
Run Code Online (Sandbox Code Playgroud)

给我这个JSON:

{"simpleProp":"test","modifiedToSimplePropWithNewName": "test2"}
Run Code Online (Sandbox Code Playgroud)

尝试

我在想,因为ko.mapping.toJSON有一个映射参数,就像为这个方法创建另一个映射一样简单.但似乎ko.mapping实际上忽略了我的自定义属性创建:

var mappingOptions = {

    // ignored
    'simpleProp': {
        create: function (thing) {
            return "Changed simpleProps value";
        }
    },

    // working
    ignore: ["simpleProp3"]

};
Run Code Online (Sandbox Code Playgroud)

更多的信息

我为你创造了一个jsFiddle.

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

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

结果将是:

{"simpleProp":"test","complexProp":{"simpleProp2":"test2"}}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,将应用ignore选项,而'simpleProb'/ create则不会.

任何帮助深表感谢.谢谢!

PS:我知道这种映射不会达到预期的效果.这只是一个"意志'simpleProp'被修改?" - 测试.

lag*_*one 5

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

所以你可以这样做(更新jsfiddle):

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

只需将toJSON方法格式化为对象,就像您希望它看起来那样,您就可以了.