knockout.js选项绑定不反映添加项目
问题描述:
页面正确显示顾问的原始列表。但是,当我尝试在数组中使用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);
}
答
您更改了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();
}
答
可观察到的数组中有相同的方法,规则排列,所以如果你使用:的
viewModel.studentAdvisers.push(student)
代替:
list.push(student);
,并与接头一样,淘汰赛将被通知变化。
这绝对奏效!谢谢!为什么我必须这样做? –
因为当你调用这个:var list = viewModel.studentAdvisers();你得到js数组,敲除不知道它会发生什么。为了避免callig valueHasMutated,你应该直接从viewModel.studentAdvisers调用push函数 - viewModel.studentAdvisers.push(NewValue) –
我试过了,没有将它设置为变量“list”,它仍然需要valueHasMutated()。 –