Knockout.js 敲除从自动映射的observable创建空对象

Knockout.js 敲除从自动映射的observable创建空对象,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我正在尝试用ko映射解决一个小问题。场景是我的ViewModel基本上是一组对象。每个对象都是通过json调用创建的,方式如下: var ViewModel = ko.observableArray(); $.getJSON(url, function(data) { ViewModel.push(ko.mapping.fromJSON(data)); }); 这是完美的,我可以在我的HTML中做各种各样的魔术。 问题是,例如,我是否想向我的集合中添加一些内容,比如说支持客户端“添加

我正在尝试用ko映射解决一个小问题。场景是我的ViewModel基本上是一组对象。每个对象都是通过json调用创建的,方式如下:

var ViewModel = ko.observableArray();

$.getJSON(url, function(data) {
    ViewModel.push(ko.mapping.fromJSON(data));
});
这是完美的,我可以在我的HTML中做各种各样的魔术。 问题是,例如,我是否想向我的集合中添加一些内容,比如说支持客户端“添加和编辑”场景。我想做一些类似的事情:

<input type="button" value="add new" data-bind="click: AddNew" />
function AddNew() {
    this.push(// WHAT HERE?);
}
基本上,我需要推一个与其他已经存在的对象相同的对象,但是当然,所有的属性都是空白的


我正在考虑一种从列表中“克隆”一个对象并将所有可观察对象设置为空的方法,但我不知道从哪里开始。我担心://

如果您要将功能扩展到客户端编辑/添加,那么我建议将您的对象形式化为js类,然后在内部映射这些对象。这将允许您在主viewmodel上添加方法,并在客户端轻松创建空白实例


映射插件的一个警告是,对于更新对象,它希望这些对象最初是由插件映射的。下面是一个如何实现的快速示例

var YourObjectClass = function (config) {
    var self = this, data;

    // your default structure goes here
    data = $.extend({
        name: "",
        id : -1
    }, config);

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

var viewModel = function(initialData) {
    var self = this;

    ko.mapping.fromJS(initialData, {
        items: {
            create : function (options) {
                return new YourObjectClass(options.data);
            }
        }
    }, self);

    this.AddNew = function () {
       self.items.push(new YourObjectClass());
    }
};

希望这对您有所帮助。

您知道这些字段吗,还是需要从服务器上获取的内容复制这些字段?如果是这样的话,我想你会很难开始一份新的清单。您可以创建一个模板并推送它:

var myTemplate = {
    name: ko.observable(),
    phone: ko.observable()
};

ViewModel.push(myTemplate); // add empty item
我从未见过视图模型是可观察的或可观察的数组,为什么不这样创建它呢

function ViewModel() {
    self = this;
    self.items = ko.observableArray();
}

var myViewModel = new ViewModel();
ko.applyBindings(myViewModel);

$.getJSON(url, function(data) {
    myViewModel.items.push(ko.mapping.fromJSON(data));
});

第二种方法是我正在做的。我不清楚抱歉,但我的意思是虚拟机只包含一个集合,我完全像那样填充它。你是对的,我知道单个项目的属性,但我使用自动映射来避免为它们创建模板的麻烦。如果这是唯一的方法,那也没问题,但我想知道ko或mapping(或JavaScript本身)是否提供了某种从以前存在的对象“更新”对象的方式(可能是探索元数据?克隆?)。“映射插件的一个警告是,对于更新对象,它希望这些对象最初由插件映射。这是一个如何做到这一点的快速例子。”-如果我早知道这一点,我会节省很多时间!