【问题标题】:Populating a dropdown list using knockout and jquery ajax使用敲除和 jquery ajax 填充下拉列表
【发布时间】:2015-02-07 19:39:52
【问题描述】:

我正在像这样使用 ajax 填充下拉列表。

    var getCertifications = function () {
    $.getJSON("/Provider/GetCertifications", function (data) {
        $.each(data, function (i, item) {
            var certification_data = "<option value=" + item.CertificationID + ">" + item.Certification + "</option>";
            $(certification_data).appendTo("#certification");
          });
      });
   };

getCertifications 在 document.ready 方法中被调用。 我想根据第一个下拉列表中所选选项的值填充第二个下拉列表。所以我写了另一个函数

 var getSpecializations = function () {
var value = $("#certification").val();
$.getJSON("/Provider/GetSpecializations/", { certificationID: value }, function (data) {
    $.each(data, function (i, item) {
        var specialization_data = "<option value=" + item.SpecializationId + ">" + item.Specialization + "</option>";
        $(specialization_data).appendTo("#specialization");
          });
      });
  }

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" >
                    <option value="0">Select a Certification</option>
                </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" >
                    <option value="0">Select a Specialization</option>
                </select>
            </div>
        </div>

我的视图模型具有如图所示的可观察对象

self.certification = ko.observable("");
self.specialization = ko.observable("");

我在第一个下拉列表的 subscribe 方法中调用 getSpecializations 函数,就像这样

self.certification.subscribe(function () { 
    getSpecializations();      
});

控制台中没有错误,但是第二个下拉列表,即;专业化下拉菜单没有填充。你们能指出我正确的方向吗?

【问题讨论】:

  • 那是因为你试图推动而不是分配。这样做self.yourarray([//data])

标签: jquery ajax knockout.js


【解决方案1】:

你需要这样做

查看:

<select data-bind="options:specializationArray,optionsText:'Specialization',optionsValue:'SpecializationId',value:specialization" />

视图模型:

 var getSpecializations = function () {
var value = self.
$.getJSON("/Provider/GetSpecializations/", { certificationID: value }, function (data) {
   self.specializationArray(data) //array with Specialization and SpecializationId
  }

工作小提琴here

【讨论】:

  • 我只是有一个后续问题,因为我认为这可能会导致问题。我从控制器接收的 Tge 数据采用正确的 JSON 格式,例如 [ {"CertificationID":1,"Certification ":"MBBS"}, {"CertificationID":2,"Certification":"MD"}, {"CertificationID":3,"Certification":"RN"}, {"CertificationID":4,"Certification": "MSN"} ] 但是 getJSON 中的数据看起来像这样。 [对象,对象,对象,对象]。这看起来像一个对象数组。这可能会造成问题。在您的小提琴中,您使用 JSON 数据来初始化数组而不是对象数组。
  • 查看如何使用 arrayMap 。 jsfiddle.net/supercool/c0y832bc/13 。干杯
  • 虽然我说它们是一个对象数组是对的。我是 javascript 和任何与客户端相关的技术的菜鸟。虽然 Array[4] 0: Object 看起来像这样认证:“MBBS”CertificationID:1 1:对象认证:“MD”CertificationID:2 2:对象认证:“RN”CertificationID:3 3:对象认证:“MSN”CertificationID:4 长度:4
  • 这样 fiddle 可以解决您的问题,或者我们回到第一方。看到客户端就是调试尝试 console.log(//your stuff) 并检查浏览器控制台。 .arrayMap(data , function(item){ console.log(item.CertificationID你现在在控制台窗口中得到了什么
  • 你应该让你的代码在 ajax 调用成功中,即使它的异步也没关系。不同的文件(你的意思是不同的js)所以没问题你应该正确引用。例如:如果函数 build() 在当前 js 文件中的不同 js 文件中,我们可以访问它 new build .
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多