选择的字段未填充预定义的selectedOptions

时间:2018-12-21 18:39:46

标签: jquery html knockout.js jquery-chosen

在设置选定的选项然后更新该字段时,我很难填充选定的多选字段。

在我的应用程序中,我使用淘汰表.js将observables / observableArrays绑定到我的字段,并且在所选字段中,选项是对象列表。根据此字段中选择的选项,我想用先前选择的对象填充一个单独的下拉菜单。

在没有任何预先选择的选项的情况下,一切正常,但是当我使用JavaScript填充选择的选项敲除observableArray并调用选择的更新命令时,选择的字段仍为空,但单独的下拉列表已成功更新

HTML:

<label>User(s):</label>
<select class="chosen form-control" multiple data-bind="options: userOptions, selectedOptions: selectedUsers,
            optionsText: function (user){ return user.name}"></select>
<label>Primary User:</label>
<select class="form-control" data-bind="options: selectedUsers, optionsText: 'name', value: primaryUser></select>

删除变量:

vs.userOptions: ko.observableArray([]);
vs.selectedUsers: ko.observableArray([]);
vs.primaryUser: ko.observable();

userOptions / selectedUsers对象:

{
id: -1,
email: "",
name: ""
}

JavaScript:

vs.selectedUsers.removeAll();
$.ajax({
    url: url,
    type: "GET",
    success: function (data) {
        for (var i = 0; i < data.length; i++) {                
            var object = {
                id: data[i].id,
                email: data[i].email,
                name: data[i].name
            };
            vs.selectedUsers.push(object);
            if (data[i].primaryUser) {
                vs.primaryUser(object);
            }
        }
        $(".chosen").trigger("chosen:updated");
    },
    error: function (xhr, status, error) {
        //Handle error...
    }
});

**注意:来自Ajax GET调用的数据返回一个包含pkey,id,电子邮件,名称和primaryUser的对象数组,其中primaryUser是一个布尔值,用于标识它们是否为选择的primaryUser。

1 个答案:

答案 0 :(得分:0)

更新:回到问题所在,找到了有效的修复程序。我不得不调整ajax成功函数中的代码:

vs.selectedUsers.removeAll();
$.ajax({
    url: url,
    type: "GET",
    success: function (data) {
        for (var i = 0; i < data.length; i++) {
            for (var j = 0; j < vs.userOptions().length; j++) {
                if (vs.userOptions()[j].id === data[i].id) {
                    vs.selectedUsers.push(vs.userOptions()[j]);
                    if (data[i].primaryUser) {
                        vs.primaryUser(vs.userOptions()[j]);
                    }
                    break;
                }
            }
        }
        $(".chosen").trigger("chosen:updated");
    },
    error: function (xhr, status, error) {
        //Handle error...
    }
});