Knockout.js 淘汰JS选择框问题

Knockout.js 淘汰JS选择框问题,knockout.js,mootools,knockout-3.0,Knockout.js,Mootools,Knockout 3.0,我正在为我的项目使用淘汰3.4.0以及MooTools。我需要存储字段的信息。其中一个信息是通过KO加载的选择框 <select data-bind="options: agencyContacts,optionsText: 'name',optionsValue:'id' , optionsCaption: 'Please select...',value:agencyContactSelected"> 信息保存在数据库中。当从DB加载相同的信息时,我需要使用相应的DB条目自动选

我正在为我的项目使用淘汰3.4.0以及MooTools。我需要存储字段的信息。其中一个信息是通过KO加载的选择框

<select data-bind="options: agencyContacts,optionsText: 'name',optionsValue:'id' , optionsCaption: 'Please select...',value:agencyContactSelected">
信息保存在数据库中。当从DB加载相同的信息时,我需要使用相应的DB条目自动选择选择框。我的ViewModel如下所示

var vm={};
var Information = {

    Implements: [Options, Events],

    /**
     * Method: initialize
     *
     * Parameters:
     *  options (object) - the options object
     */
    initialize: function(options) {

        var self = this;
        self.draw();
    },
     draw: function() {
        vm.agencyContactViewModel.agencyContactSelected(<ID>);
     }
}

var agencyContactViewModel = function() {
    var self = this;
    self.agencyId = ko.observable();
    self.agencyContacts = ko.observableArray();
    self.agencyContactSelected = ko.observable();
    self.agencyContactSelected.subscribe(function(newAgencyContactSelected) {
            alert(newAgencyContactSelected);
    });

    self.agencyId.subscribe(function(newAgencyId) {
        self.agencyContacts.removeAll();
        self.address();
        var submitObj = {
            'contactId': newAgencyId
        };
        var myRequest = new ReqJSON({
            'url': '/gateway?file=contacts.views&method=getContactRefs',
            onSuccess: function(responseJSON) {
                if (responseJSON.length > 0) {
                    var length = responseJSON.length;
                    for (var i = 0; i < length; i++) {
                        self.agencyContacts.push(responseJSON[i]);
                    }
                }
            }
        }).send(JSON.encode(submitObj));
    });
}

 myInformation = new Information();

 window.addEvent('domready', function() {
    vm.agencyContactViewModel = new agencyContactViewModel();
    ko.applyBindings(vm.agencyContactViewModel, document.getElementById('agency_contact_wrapper'));
});
虽然我已经为选择框设置了正确的ID,但是“agencyContactSelected”observable的相应subscribe函数被调用了两次,第一次使用DB的ID,第二次使用未定义的值。由于此未定义的值,未设置选择框。原因可能是什么


PS:如果我从HTML中删除'value:agencyContactSelected',订阅将被正确调用,即使用DB值调用一次

我在你的问题中看到了几个令人惊讶的因素:

为什么使用OptionValue?它在这里似乎没有用 在draw函数中,调用agencyContactViewModel.agencyContactSelected,但agencyContactViewModel是一个函数。为viewmodel的函数和属性使用相同的名称是非常棘手的,应该避免使用 我看不到vm变量的定义
当agencyId更改时,将清除所有agencyContacts。这将重新评估选项绑定,删除其中的所有选项。仍有选定的ID,但knockout将无法找到相应的值。这将导致设置未定义的值。稍后,当项目异步重新出现时,它将丢失其选择状态,并且无法检索。@user3297291即使我删除了更新agencyContacts的agencyId订阅函数,agencyContactSelected subscribe函数仍被调用了两次。1我的印象是,选项值中指定的任何内容都将在agencyContactSelected值属性中设置2我错过了3编辑的任何改进?另外,由于信息不是一个函数,我很想知道这段代码的作用:myInformation=新信息;仍然没有改进。信息是基于工具的类。在调用新信息时,它将调用信息类中的initialize方法。