2013-08-20 145 views
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#中所做的。

有誰知道這種編碼是否可行?希望是!

在此先感謝

+0

請張貼適當的JavaScript和HTML。考慮創建一個重現問題的小提琴。 – Damien

+1

請閱讀[幫助頁面](http://stackoverflow.com/editing-help)以正確格式化您的代碼。 – Amy

回答

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/

+0

感謝你們兩位。我感謝你在這個問題上幫助我的巨大知識。你倆都很聰明。雖然我工作的項目比邏輯(教師 - >學生)複雜得多,但我能夠利用你的幫助來解決我一週的挫折感。再次感謝你們倆...... – aaquino4u

0

如果你想顯示學生的老師,東西like this應該工作。

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構造函數中的一些代碼創建學生的唯一列表。映射插件仍然可以幫助解決這個問題,因爲「關鍵」功能可以防止愚蠢行爲。