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

时间:2012-05-26 02:48:54

标签: knockout.js knockout-mapping-plugin

我正在尝试用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" />

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

function AddNew() {
    this.push(// WHAT HERE?);
}

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

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

2 个答案:

答案 0 :(得分: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());
    }
};

希望这有帮助。

答案 1 :(得分:0)

您是否知道这些字段,或者您是否需要从服务器中获取这些字段?如果是这种情况,我认为你很难开始新的清单。你可以创建一个模板并推送它:

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));
});