Knockout.js 敲除映射插件-使所有对象可见

Knockout.js 敲除映射插件-使所有对象可见,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我有以下淘汰视图模型: var myViewModel = { courseData: ko.observable(null); }; 然后,我从服务器接收以下数据: var data = { "courses": [ { "srcCourses": [ { "code": "001", "name": "Course 1"}, { "code": "002", "name": "Course 2"} ], "destCourse": { "code

我有以下淘汰视图模型:

var myViewModel = {
    courseData: ko.observable(null);
};
然后,我从服务器接收以下数据:

var data = {
  "courses": [
    {
      "srcCourses": [ { "code": "001", "name": "Course 1"}, { "code": "002", "name": "Course 2"} ],
      "destCourse": { "code": "003", "name": "Course 3"}
    },
    {
      "srcCourse": [ { "code": "004", "name": "Course 4"}, { "code": "005", "name": "Course 5"} ],
      "destCourse": { "code": "006", "name": "Course 6"}
    }
  ]
}
我通过敲除映射插件运行到我的视图模型中,如下所示:

this.courseData(ko.mapping.fromJS(data));
这就基本上给我留下了以下视图模型对象层次结构:

{
  KnockoutObservable(this.courseData): {
    KnockoutObservableArray(Courses): [
      {
        KnockoutObservableArray(srcCourses): [ ... ],
        destCourse: { KnockoutObservable(code), KnockoutObservable(name) }
      },
      {
        ...
      }
    ]
  }
}
问题是“destCourse”对象仍然是一个对象,不会转换为可观察对象(尽管destCourse对象中的每个属性都转换为可观察对象)


我怎样才能使所有的子对象的数据转换为可观察的呢?理想情况下是以最通用的方式?

我以前遇到过这种情况,但我从来没有弄清楚为什么knockout会对子对象执行这种操作

无论如何,你只需要给地图绘制者一些指导

下面是一个片段:

var数据={
“课程”:[
{
“srcCourses”:[{“代码”:“001”,“名称”:“课程1”},{“代码”:“002”,“名称”:“课程2”}],
“目标课程”:{“代码”:“003”,“名称”:“课程3”}
},
{
“srcCourse”:[{“code”:“004”,“name”:“Course 4”},{“code”:“005”,“name”:“Course 5”}],
“目标课程”:{“代码”:“006”,“名称”:“课程6”}
}
]
}
var coursesMapping={
“课程”:{
创建:函数(选项){
返回ko.observable(ko.mapping.fromJS(options.data));
}
}
}
var-mapped=ko.mapping.fromJS(数据、课程地图);
console.log(mapped.courses()[0].destcurses().name());//“课程3”


请看这个问题:。:-)您可以添加此问题的答案:。:-)它工作得很好——我希望所有的解决方案都这么简单。非常感谢:)
var coursesMapping = {
  "destCourse":{
    create:function(options){
      return ko.observable(ko.mapping.fromJS(options.data));
    }
  }
}

var mapped = ko.mapping.fromJS(data, coursesMapping);