Ajax 如何在敲除映射中创建类型化集合类?

Ajax 如何在敲除映射中创建类型化集合类?,ajax,json,knockout.js,knockout-mapping-plugin,Ajax,Json,Knockout.js,Knockout Mapping Plugin,我将使用knockout和,以便编写如下代码: function ContactViewModel() { //other properties... this.emails = ko.observableArray(); } function ContactEmailViewModel() { //other properties... this.address = ko.observable(); } var koContactMap = { 'e

我将使用knockout和,以便编写如下代码:

function ContactViewModel() {
    //other properties...
    this.emails = ko.observableArray();
}

function ContactEmailViewModel() {
    //other properties...
    this.address = ko.observable();
}

var koContactMap = {
    'emails': {
        create: function (options) {
                    return new ContactEmailViewModel(options.data);
        }
    }
};

var model = new ContactViewModel();
ko.mapping.fromJS([JSON data from web service], koContactMap, model);
在英语中,我有
联系人
电子邮件
,而
联系人
电子邮件

这非常有效,我可以加载联系人并填充数据和电子邮件,电子邮件的类型为
ContactEmailViewModel
,如我所愿

但我感到困惑的是:为什么map create方法返回一个单数的电子邮件对象,而不是一个电子邮件对象集合
emails
属性是一个集合,但似乎是通过返回单个对象来填充的,并且被调用多次,每个成员调用一次


这将正确填充
电子邮件
属性。但是现在我想把
emails
从数组改为
EmailsList
对象,这样我就可以给它方法了,我不知道怎么做,因为create方法会返回单独的emails,不是整个emails属性。

对于该行为,您可以在emails属性上添加
ignore
,并让映射插件将电子邮件映射到一个标准数组中,您可以向EmailsList构造函数提供该数组

var emailMapping = {
   create: function(opt) {
      return new Email(opt.data);
   }
};

this.emails = new EmailList(ko.mapping.fromJS(arr, emailMapping));
嗯,你也可以用一个observableArray扩展一个自定义类,我想(还没有测试过)ko.mapping会像这样将电子邮件添加到你的电子邮件列表中

this.emails = new EmailList(); //This is is a ko.observableArray the mapping plugin will populate it with emails
ko.mapping.fromJS(data, mappingInfo, this);

更新:我刚刚确认解决方案二有效,所以我认为这是一个很好的方法


我知道如何忽略,但我不知道您将把代码放在何处来创建和返回EmailsList对象,以及从何处获取电子邮件对象数据。你能推荐一些代码吗?请参阅更新,详细,但我认为这是使用当前版本的Mapping的唯一方法,请参阅可能的第二种解决方案
//stolen from ko source
function setPrototypeOf(obj, proto) {
        obj.__proto__ = proto;
        return obj;
    }

ko.MyList = function(arr) {
    var result = ko.observableArray(arr);
    return setPrototypeOf(result, ko.MyList.fn);
}

ko.MyList.fn = {
    pushMyThingy: function(obj) {
        this.push(obj);
    }
};