Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用敲除可观测数组填充dropdownlist_Javascript_Json_Knockout 2.0_Knockout Mvc - Fatal编程技术网

Javascript 使用敲除可观测数组填充dropdownlist

Javascript 使用敲除可观测数组填充dropdownlist,javascript,json,knockout-2.0,knockout-mvc,Javascript,Json,Knockout 2.0,Knockout Mvc,我正在尝试将两个下拉列表绑定到剔除可观察数组。条件是必须首先填充第一个下拉列表。第二个下拉列表依赖于第一个下拉列表。因此,我订阅第一个下拉列表以填充第二个下拉列表。 为了尝试实现这一点,我编写了以下代码 HTML是 <div class="form-group"> <label class="col-sm-2 control-label labelfont">Certification:</label>

我正在尝试将两个下拉列表绑定到剔除可观察数组。条件是必须首先填充第一个下拉列表。第二个下拉列表依赖于第一个下拉列表。因此,我订阅第一个下拉列表以填充第二个下拉列表。 为了尝试实现这一点,我编写了以下代码

HTML是

       <div class="form-group">
            <label class="col-sm-2 control-label labelfont">Certification:</label>
            <div class="col-sm-6">
                <select class="form-control" id="certification" name="certification" data-bind="value: certification, options: certificationArray, optionsText: 'Certification', optionsValue: 'CertificationID', optionsCaption: 'Select a Certification'">
                </select>
            </div>
        </div>
    <div class="form-group">
             <label class="col-sm-2 control-label labelfont">Specialization:</label>
            <div class="col-sm-6">
                <select class="form-control" id="specialization" name="specialization" data-bind="value: specialization, options: specializationArray,optionsText:'Specialization',optionsValue:'SpecializationId', optionsCaption: 'Select a Specialization'">
                </select>
            </div>
        </div>
获取相应认证和规范的函数如下

 var getCertifications = function () {
$.getJSON("/Provider/GetCertifications", function (data) { 
    return data;
    });
});
};
    var getSpecializations = function () {
$.getJSON("/Provider/GetSpecializations/", { certificationID: $("#certification").val() }, function (data) {       
    self.specializationArray(data) 
   })
 }
JSON响应如下所示 JSON看起来像这样
有人能告诉我正确的方向吗?我对knockout和JSON完全不熟悉。我在这里束手无策。因此,任何帮助都将不胜感激。提前感谢。

在knockout中,数组的值与下拉菜单中的选项是分开的。您不会更改observableArray,而是更改observableArray本身的值。不过,最好使用
ko.computed
字段来保存第二个下拉列表的值

但我真的不明白为什么你认为你的下拉列表必须按一定的顺序排列。从你的问题来看,我不太清楚认证和专业之间的关系。在
self.certification.subscribe()
中,您实际上没有做任何事情,就像在填充专门化时存在任何依赖关系一样。您在证书中提供的JSON也没有任何相关的外键。但如果用于认证的JSON如下所示:

[{"CertificationID": 1, "Certification": "M.B.B.S.", "SpecializationID": "7"},{"CertificationID": 2, "Certification": "M.D.", "SpecializationID": "3"}, ...]
虽然专门化的JSON看起来像这样

[{"SpecializationID": 1, "Specialization": "Cardiology"},
 {"SpecializationID": 2, "Specialization": "Dentistry"}, 
 {"SpecializationID": 3, "Specialization": "General Practioner"}, ...
 {"SpecializationID": 7, "Specialization": "Surgery"}
]
我相信这样做应该会奏效:

self.specialization = ko.computed(function() {        
    return ko.utils.arrayFirst(getCertifications(), function(certs) {
        return certs.ID == self.SpecializationID();
    }).SpecializationID;        
});
但是,既然我看不出您在哪里有任何依赖关系,那么为什么不直接填写它们呢:

self.certificationArray = ko.observableArray(getCertifications());
self.specializationArray = ko.observableArray(getSpecializations());
self.certification = ko.observable(vm.certification);
self.specialization = ko.observable(vm.specialization);
您可以使用从数据集返回的viewmodel设置这些值,它应该是数据库表中的ID字段(CertificationID、SpecializationID)

self.certificationArray = ko.observableArray(getCertifications());
self.specializationArray = ko.observableArray(getSpecializations());
self.certification = ko.observable(vm.certification);
self.specialization = ko.observable(vm.specialization);