knockout从自动映射的observable创建一个空对象

Tal*_*ris 9 knockout-mapping-plugin knockout.js

我试图用ko映射解决一个小问题.场景是我的ViewModel基本上是一个对象集合.每个对象都是通过json调用创建的,这样:

var ViewModel = ko.observableArray();

$.getJSON(url, function(data) {
    ViewModel.push(ko.mapping.fromJSON(data));
});
Run Code Online (Sandbox Code Playgroud)

这非常有效,我可以在HTML中做各种魔术.问题是,例如,如果我想在我的收藏中添加一些东西,那么就说支持客户端"添加和编辑"场景.我想做的事情如下:

<input type="button" value="add new" data-bind="click: AddNew" />
Run Code Online (Sandbox Code Playgroud)

我希望ViewModel中的AddNew函数类似于:

function AddNew() {
    this.push(// WHAT HERE?);
}
Run Code Online (Sandbox Code Playgroud)

基本上我需要推送一个与已经存在的对象相同的对象,当然还有所有消隐的属性......

我想到了一种从列表中"克隆"对象并将所有可观察对象设置为空的方法,但我不知道从哪里开始我害怕:/

mad*_*kay 7

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

对映射插件的一个警告是,为了更新对象,它希望这些对象最初是由插件映射的.这是一个如何完成它的快速示例.

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());
    }
};
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.