Ajax 如何在敲除映射中创建类型化集合类?
我将使用knockout和,以便编写如下代码: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
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);
}
};