使用 ko.mapping 插件编辑和插入新记录

Using ko.mapping plugin to edit and insert new records

我正在使用 ko.mapping 插件将数据从服务器映射到客户端。

我真的很喜欢这个事实,因为我可以在服务器上编写一次模型,而不必在客户端重写相同的模型属性。

我正在做一些我认为很常见的任务。我有一个记录列表,我希望能够插入和编辑它们。 我创建了一个 jsfiddle

我已经将列表绑定到 UI 并且可以编辑现有项目

我对如何允许插入新记录感到困惑。

我的对象很基础

 [{
    "CustomerId": "1cd608c2-d980-4370-9861-c49e0811923c",
    "FirstName": "Adam",
    "LastName": "Jones",
    "StoreCustomerId": "9999 9999 9999 0002",
}]



var ViewModel = function (data) {
var self = this;

var mapping = {
    customers: {
        create: function (options) {
            console.log("mapping");
            var vm = ko.mapping.fromJS(options.data);
            console.log(vm);
            vm.FullName = ko.computed(function () {
                return vm.FirstName() + " " + vm.LastName();
            });

            return vm;
        }

    }
};

ko.mapping.fromJS(data, mapping, self);

self.selectedCustomer = ko.observable();


self.delete = function (customer) {
    self.customers.remove(customer);
}

self.edit = function (customer) {
    console.log(customer);
    self.selectedCustomer = customer;
}

self.save = function (customer) {
    console.log(customer);
    //      console.log(customer.FirstName);
    self.customers.push(customer);
}
 }

 ko.applyBindings(new ViewModel(dataFromServer));

我是否必须创建一个新的可观察对象,例如

self.selectedCustomer = ko.observable();

当我点击编辑按钮时,输入被填充。如何创建新记录?

<div data-bind="with:selectedCustomer">
    <input placeholder="FirstName" data-bind="value:FirstName" />
    <input placeholder="LastName" data-bind="value:LastName" />
</div>

请比我聪明的人快速浏览一下 fiddle 并帮助解决我做错的地方。我想我很接近但缺少一些东西。

感谢您的帮助!

您需要创建新的客户视图模型。您可以像这样使用现有的映射来做到这一点

var customer = mapping.customers.create({ data: {
    CustomerId: "",
    FirstName: "",
    LastName: "",
    StoreCustomerId: ""
}});

然后将其推送给现有客户 select:

self.customers.push(customer);
self.selectedCustomer(customer);

updated fiddle