2013-07-31 160 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); 

,并与接头一样,淘汰赛将被通知变化。