1

我对淘汰赛了解不多,但我正在投入其中。问题:我试图在对象列表(数组)中检索对象列表(数组)。

示例:(只是为了使其非常简单)

老师 -> 学生

  1. 老师#1

    • 学生 1
    • 学生 2
    • 学生 3
  2. 老师#2

    • 学生 1
    • 学生 2
    • 学生 3
  3. 老师#3

    • 学生 1
    • 学生 2
    • 学生 3

到目前为止,我能够显示所有教师的列表,但是在显示学生列表时,最后一个节点(教师#3)显示来自教师的所有学生(#1 和#2 和#3);#1、#2 老师是空白的。

var ViewModel = {
       Teachers: ko.observableArray([])
}

function LoadTeachers(....) //Here Teacher list is loaded successfully.>

ko.applyBindings(ViewModel);


function teacher(T){
 this.TeacherID:ko.observable(T.TeacherID);
 this.TeacherName: ko.observable(T.TeacherName);

 this.StudentArray = ko.observableArray([]);

 function student(s){
    this.StudentID=ko.observable(s.StudentID);
    this.Name = ko.observable(s.s.Name);
 }

$.getJson('...');  // here is where Student array is loaded. 

}

然后我会在我的视图页面中:

foreach: Teacher  
foreach: Student

我只是在使用我的 C# 知识并申请淘汰赛。我认为问题在于在教师对象中声明学生数组。因为学生是每个老师的孩子。这就是我在 C# 中所做的。

有谁知道这种编码是否可行?希望是!

提前致谢

4

2 回答 2

0

我暂时忽略了 Knockout 映射插件(它很好,但写得不是很好)。原因是为了让你简单地看到解决方案。所以你有几个淘汰赛的怪事,但大多数时候你犯了一个关闭错误。代码中最重要的部分是var newTeacher = .... 这很重要的原因是因为您需要在嵌套的 ajax 闭包中拥有它。所以这是代码和工作小提琴的链接:

$(document).ready(function(){
    var ViewModel = {
        Teachers: ko.observableArray([])
    };

    // some fake data to use instead of the ajax calls below, just so it works in fiddle
    var fakeTeacherData = [{TeacherID: 1, TeacherName: 'Dan'}, {TeacherID: 2, TeacherName: 'Marian'}];
    var fakeStudentData = [{StudentID: 1, Name: 'Student 1'}, {StudentID: 2, Name: 'Student 2'}];

    $.get('/echo/json', function(teacherData){
        // here you would use the data passed in of course
        ko.utils.arrayForEach(fakeTeacherData, function(T){
            var newTeacher = new teacher(T);
            ViewModel.Teachers.push(newTeacher);

            $.get('/echo/json', function(studentData){
                // here you would use the data passed in of course   
                ko.utils.arrayForEach(fakeStudentData, function(S){
                    newTeacher.Students.push(new student(S));
                });
            });
        });
    });
    ko.applyBindings(ViewModel);
});

function teacher(T){
    this.TeacherID = ko.observable(T.TeacherID);
    this.TeacherName = ko.observable(T.TeacherName);
    this.Students = ko.observableArray([]);
}

function student(S){
    this.StudentID = ko.observable(S.StudentID);
    this.Name = ko.observable(S.Name);
}

http://jsfiddle.net/kXQxA/

于 2013-08-20T23:05:41.333 回答
0

如果你想按老师显示学生,这样的事情应该可以工作。

Teacher = function (data) {
    var self = this;
    self.Id = ko.observable(data.Id || 0);
    self.Name = ko.observable(data.Name || '');
    // See JSFiddle for mapping
    self.Students = ko.mapping.fromJS(data.Students, StudentMapping);
    return self;
};

Student = function (data) {
    var self = this;
    self.Id = ko.observable(data.Id || 0);
    self.Name = ko.observable(data.Name || '');
    return self;
};

StaffViewModel = function (data) {
    var self = this;
    // See JSFiddle for mapping
    ko.mapping.fromJS(data, StaffMapping, self);
    return self;
};

我使用的是原始的 Knockout 映射插件,但您可以使用 viewmodel 插件。

如果您想在单独的列表中显示学生和教师,那么我建议不要让学生成为“教师”的可观察属性,而是使用 ViewModel 构造函数中的一些代码来创建唯一的学生列表。映射插件在这里仍然会有所帮助,因为“键”功能可以防止被骗。

于 2013-08-20T18:13:36.030 回答