2013-07-31 161 views
0

頁面正確顯示顧問的原始列表。但是,當我嘗試在數組中使用push()方法時,列表大小會更新,但頁面上的選擇選項列表不會更新。我需要告訴淘汰賽更新什麼嗎?下面是一些示例代碼:knockout.js選項綁定不反映添加項目

function updateStudentAdviserList(student) { 
    var list = viewModel.studentAdvisers();  
    if (student.IsStudentAdviser() == "true" || student.IsStudentAdviser() == true) { 
     var alreadyInList = false; 
     for (var i = 0; i < list.length; i++) { 
      alert(list[i].Id); 
      if (list[i].Id == student.Id()) { 
       return; 
      } 
     } 

     list.push(student); 
     alert('new size: ' + list.length); 
    } else { 
     for (var i = 0; i < list.length; i++) { 
      alert(list[i].Id); 
      if (list[i].Id == student.Id()) { 
       list.splice(i, 1); 
       alert('new size: ' + list.length); 
       break; 
      } 
     } 
    } 
} 

function ViewModel(data) { 
    var self = this;  
    this.studentAdvisers = ko.observableArray(data); 
} 

回答

1

您更改了js陣列不observableArray。您必須通知knockout有關更改。你可以撥打電話valueHasMutated

function updateStudentAdviserList(student) { 
    var list = viewModel.studentAdvisers();  
    if (student.IsStudentAdviser() == "true" || student.IsStudentAdviser() == true) { 
     var alreadyInList = false; 
     for (var i = 0; i < list.length; i++) { 
      alert(list[i].Id); 
      if (list[i].Id == student.Id()) { 
       return; 
      } 
     } 

     list.push(student); 
     alert('new size: ' + list.length); 
    } else { 
     for (var i = 0; i < list.length; i++) { 
      alert(list[i].Id); 
      if (list[i].Id == student.Id()) { 
       list.splice(i, 1); 
       alert('new size: ' + list.length); 
       break; 
      } 
     } 
    } 

    viewModel.studentAdvisers.valueHasMutated(); 
} 
+0

這絕對奏效!謝謝!爲什麼我必須這樣做? –

+1

因爲當你調用這個:var list = viewModel.studentAdvisers();你得到js數組,敲除不知道它會發生什麼。爲了避免callig valueHasMutated,你應該直接從viewModel.studentAdvisers調用push函數 - viewModel.studentAdvisers.push(NewValue) –

+0

我試過了,沒有將它設置爲變量「list」,它仍然需要valueHasMutated()。 –

1

可觀察到的數組中有相同的方法,規則排列,所以如果你使用:的

viewModel.studentAdvisers.push(student) 

代替:

list.push(student); 

,並與接頭一樣,淘汰賽將被通知變化。