knockout.js选项绑定不反映添加的项目

时间:2013-07-31 13:06:18

标签: knockout.js

该页面正确显示了原始顾问列表。但是,当我尝试将push()方法用于数组时,列表大小会更新,但页面上的选择选项列表不会更新。我是否需要告诉淘汰赛更新或其他什么?以下是一些示例代码:

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);
}

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

可观察数组与常规数组具有相同的方法,因此如果使用:

viewModel.studentAdvisers.push(student)

而不是:

list.push(student);

与splice相同,淘汰赛将通知变更。