javascript - ko.mapping.toJSON() 方法的 knockout 映射选项

标签 javascript knockout.js knockout-mapping-plugin

问题

我正在尝试将修改后的 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"}}

如您所见,ignore 选项将被应用,而 'simpleProb'/create 则不会。

非常感谢任何帮助。谢谢!

PS:我知道这个映射不会达到预期的结果。这只是一个“‘simpleProp’ 会被修改吗?”测试。

最佳答案

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

因此你可以这样做(updated jsfiddle):

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

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

关于javascript - ko.mapping.toJSON() 方法的 knockout 映射选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28462543/

相关文章:

javascript - Linkyfing 欧洲电话号码

javascript - 如何使用 Reagent Hiccup 添加点击事件以在 ClojureScript 中触发 JavaScript 事件

javascript - 将 JSON 对象转换为非 JSON 格式的对象

javascript - 我可以创建一个在删除输入文本时触发的事件吗?

knockout.js - knockout - 如果日期大于则显示元素

javascript - 如何使用模板选项将 JSON 对象数据绑定(bind)到 knockout 绑定(bind)?

jquery - Knockout.js 和 null

javascript - 使用 KnockoutJS 和 Jade 加载 json 文件

knockout.js - 在javascript函数中访问viewModel函数-knockout

javascript - knockout 映射和绑定(bind)