Knockout.js 将实体映射到viewmodels,并使用knockout mapping插件向其添加特定的观察值

Knockout.js 将实体映射到viewmodels,并使用knockout mapping插件向其添加特定的观察值,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,这是一段有效的代码,但使用knockoutjs映射插件可能会更好: 我的实体(e)上有5个域属性,我想用viewmodel将实体属性转换为可观察的。然后,我想向每个viewmodel添加另一个属性,即isSelected属性。所有这些都是通过映射插件实现的 function activate(){ var schoolyearModels = dataservice.getSchoolyears(); var schoolyearViewModels = []; for

这是一段有效的代码,但使用knockoutjs映射插件可能会更好:

我的实体(e)上有5个域属性,我想用viewmodel将实体属性转换为可观察的。然后,我想向每个viewmodel添加另一个属性,即isSelected属性。所有这些都是通过映射插件实现的

function activate(){
    var schoolyearModels = dataservice.getSchoolyears();
    var schoolyearViewModels = [];
    for (var i = 0; i < schoolyearModels.length; i++){
        var e = schoolyearModels[i];
        var schoolyearViewModel = new SchoolyearViewModel(e.schoolyearId, 
                                            e.schoolyearName, e.from, e.to, 
                                            e.lastEdited, self.Selected);
        schoolyearViewModels.push(schoolyearViewModel);
    }
    return schoolyears(schoolyearViewModels);
}
来自服务器的数据是JSON

我尝试的早期失败,因为我从映射插件获得的viewmodel毫无意义/它不包含它应该包含的属性

伪造JSON服务器数据:

function SchoolyearViewModel(id, schoolyearName, from, to, lastEdited, selected){
    var me = this;
    me.schoolyearId = id;
    me.schoolyearName = ko.observable(schoolyearName);
    me.from = ko.observable(from);
    me.to = ko.observable(to);
    me.lastEdited = ko.observable(lastEdited);
    me.isSelected = ko.computed(function (){
        return selected() === me;
    });
}
var s1 = { schoolyearId: 1, schoolyearName: 'Schoolyear 1', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s2 = { schoolyearId: 2, schoolyearName: 'Schoolyear 2', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s3 = { schoolyearId: 3, schoolyearName: 'Schoolyear 3', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s4 = { schoolyearId: 4, schoolyearName: 'Schoolyear 4', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s5 = { schoolyearId: 5, schoolyearName: 'Schoolyear 5', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s6 = { schoolyearId: 6, schoolyearName: 'Schoolyear 6', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s7 = { schoolyearId: 7, schoolyearName: 'Schoolyear 7', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s8 = { schoolyearId: 8, schoolyearName: 'Schoolyear 8', 
          from: new Date(), to: new Date(), lastEdited: new Date() };
var s9 = { schoolyearId: 9, schoolyearName: 'Schoolyear 9', 
          from: new Date(), to: new Date(), lastEdited: new Date() };

 var schoolyears = [s1, s2, s3, s4, s5, s6, s7, s8, s9];
 var jsondata = JSON.stringify(schoolyears );
 var viewModelData = ko.mapping.fromJSON(jsondata);
当我现在查看viewModelData时,我希望它有5个可观察的属性,但它们不存在


如何正确映射我的JSON数据?

关于“期望它有5个可观察的属性,但它们不存在”的含义是什么?因为
viewModelData
与数组正确匹配,所以我与其他一些东西混淆了,但事实是viewModelData的数组具有最新值中的属性,该值是内部的,不应使用。至少下划线是内部函数的标志。我可以用viewModelData枚举_latestValue数组。_latestValue.forEach(函数(e){do stuff});但是我必须访问内部最新值来添加我的第六个可观察属性。。。你看到我的痛苦了吗?根本看不到你的痛苦。1.您不必对数据进行字符串化。没有理由。您已经有了一个数组,ko.mapping.fromJS(yourArr)应该返回一个所有对象属性都设置为可观察的数组。此外,您甚至不需要ko.mapping在您的案例中,您已经有了一个客户机视图模型。在阵列中循环,新建viewmodel并传递对象以获取正在创建的viewmodel。我不明白你想在这里得到什么!我只是想通过使用映射插件并在映射插件创建/返回的viewmodel中添加第6个属性之后,消除调用函数SchoolyearViewModel()的需要。这不是一个正确的方法吗?“…1.你不必严格整理你的数据。没有理由……”我想这是你方面的误解。我只是创建数组数据来字符串化它,因为knockout需要.fromJSON()函数中的json数据,正因为如此,我创建了可以轻松创建json的数组。。。但当你说fromJS()也接受一个数组时,我就必须使用JSON。解析我的JSON数据(从服务器),然后返回一个对象数组,我猜并映射它。