Knockout.js ko.mapping创建函数,扩展对象

Knockout.js ko.mapping创建函数,扩展对象,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,在映射过程中是否可以修改对象的模式(因为缺少更好的术语)?我想是的,我就是不能让它工作。我正在尝试这样的事情: var data = { itemOne: 'someData', itemTwo: 'moreData' } var mapping = { "newItem": { create: function(options) { return ko.observable(false); } }

在映射过程中是否可以修改对象的模式(因为缺少更好的术语)?我想是的,我就是不能让它工作。我正在尝试这样的事情:

var data = {
    itemOne: 'someData',
    itemTwo: 'moreData'
}

var mapping = {
    "newItem": {
          create: function(options) {
            return ko.observable(false);
          }
    }
};

ko.mapping.fromJS(data, mapping, _model.observableArrayPart);

下面是一个示例,演示如何自定义阵列创建和定义密钥,以便您可以使用映射插件应用更新:


在这个例子中,你是说关键是所有的数据?我以为你必须通过一些“项目”来做这件事。这真是令人印象深刻的东西,我没有想象像这样把它摆出来。他们需要一个这样的例子在网站上,或者你应该添加一个到KnockMeOut:)。也许关键成为data.id?在调试我的解决方案时,看起来可能就是这样。映射插件允许您传入映射选项。
创建
功能就是其中的一部分。通常,您会为数据中的某些属性指定
创建
函数,如
,但在这种情况下,我们只是在根级别配置它们,因为我们直接处理一个数据数组。好的,我就是这样理解的。真是帮了大忙!再次感谢!就在这周,你让我摆脱了10个绑定:)。那么,在这个例子中,使用映射插件有什么意义呢?不管怎么说,你都是手工做的,不是吗?
var data = [
    { id: 1, first: "Bob", last: "Smith" },
    { id: 2, first: "Jim", last: "Jones" },
    { id: 3, first: "Delete", last: "Me" }
];

var updatedData = [
    { id: 1, first: "Robert", last: "Smith" },
    { id: 2, first: "James", last: "Jones" },
    { id: 4, first: "New", last: "Guy" }
];

var Person = function(data) {
    this.id = data.id;
    this.first = ko.observable(data.first);
    this.last = ko.observable(data.last);
    this.full = ko.computed(function() {
        return this.first() + " " + this.last();
    }, this);        
};


var dataMappingOptions = {
    key: function(data) {
        return data.id;        
    },
    create: function(options) {
        return new Person(options.data);
    }        
};


var viewModel = {
    people: ko.mapping.fromJS([]),
    loadInitialData: function() {
        ko.mapping.fromJS(data, dataMappingOptions, viewModel.people);        
    },
    loadUpdatedData: function() {
        ko.mapping.fromJS(updatedData, dataMappingOptions, viewModel.people);  
    }        
};

ko.applyBindings(viewModel);