javascript - 动态生成的下拉选项的 knockout 绑定(bind)

标签 javascript jquery knockout.js

我有 2 个下拉列表。两者都通过 knockout 进行数据绑定(bind)。我试图在这里实现两件事:第一个下拉列表是“认证”,第二个下拉列表是“特化”。

  1. 第二个下拉菜单默认应有“请选择特化”选项,但该选项并未出现。这是第一个下拉列表中发生的情况。我想我知道为什么。也许是因为 Certification 是一个可观察的数组,它通过 options 绑定(bind)数据。绑定(bind)。

  2. 不幸的是,我无法对第二个下拉列表执行相同的操作,因为它的值将取决于第一个下拉列表。尽管我已经给出了 optionsCaption对于第二个下拉列表,页面加载时我仍然看不到它。

$(document).ready(function () {
    var Provider = {
        ProviderID: ko.observable(""),
        FirstName: ko.observable(""),
        LastName: ko.observable(""),
        Certification: ko.observableArray(["M.B.B.S", "M.D.", "R.N.", "M.S.N."]),
        SelectedCertification: ko.observable(""),
        Specialization: ko.observable(""),
        TaxonomyCode: ko.observable(""),
        SSN: ko.observable(""),
        ContactNumber: ko.observable(""),
        ContactEmail: ko.observable(""),
        NPI: ko.observable("")
    };
    ko.applyBindings(Provider);

    $("#Certification").change(function () {
        if (($("#Certification").val() == "M.D.") || ($("#Certification").val() == "M.B.B.S")) {
            $("#Err_Certification").hide();
            $("#Certification").removeClass('borderclass');

            $("<option>Dermatology</option>").appendTo("#Specialization");
            $("<option>Hematology</option>").appendTo("#Specialization");
            $("<option>Neurology</option>").appendTo("#Specialization");
        } else if (($("#Certification").val() == "R.N.") || ($("#Certification").val() == "M.S.N.")) {
            $("#Err_Certification").hide();
            $("#Certification").removeClass('borderclass');
            //$("#Certification option[value='option1']").remove();
            //$("#Certification option[value='option2']").remove();
            //$("#Certification option[value='option3']").remove();

            $("<option>Pediatric Nursing</option>").appendTo("#Specialization");
            $("<option>Critical Care Nursing</option>").appendTo("#Specialization");
            $("<option>Occupational Health Nursing </option>").appendTo("#Specialization");
        } else {
            $("#Specialization").addClass('borderclass');
            $("#Err_Specialization").show();
        }
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.13.1/jquery.validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div class="container">
  <form class="form-horizontal">
    <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: SelectedCertification, options: Certification, 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, optionsCaption: 'Select a Specialization'">
        </select>
      </div>
    </div>
  </form>
</div>

最佳答案

我 fork 了 jquery 更改和一些代码,并引入了 subscribe

查看模型:

  var Provider = function () {
          var self = this;
          self.Certification = ko.observableArray(["M.B.B.S", "M.D.", "R.N.", "M.S.N."]);
          self.SpecialzationArray = ko.observableArray();
          self.SelectedCertification = ko.observable();
          self.Specialization = ko.observable();
          self.SelectedCertification.subscribe(function (val) {
            self.SpecialzationArray([]);
              if (val == "M.D." || val == "M.B.B.S") {
                  self.SpecialzationArray(["Dermatology", "Hematology", "Neurology"])
              } else if (val == "R.N." || val == "M.S.N.") {
                  self.SpecialzationArray(["Pediatric Nursing", "Critical Care Nursing", "Occupational Health Nursing"])
              } else {
                  self.SpecialzationArray([]);
              }
          });

      };

      $(document).ready(function () {
          ko.applyBindings(new Provider());
      });

查看:

<select data-bind="value: SelectedCertification, options: Certification, optionsCaption: 'Select a Certification'"></select>
<br/>
<select data-bind="value: Specialization,options:SpecialzationArray, optionsCaption: 'Select a Specialization'"></select>

每当 dropdownlist 发生变化时,因为我订阅了 DDL1 的 value 绑定(bind),我们可以有条件地填充 dropdown2 所需的数据。

用于工作 fiddle Click here

保持 View 模型干净总是更好,这在处理复杂场景时会有所帮助。

关于javascript - 动态生成的下拉选项的 knockout 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125955/

相关文章:

javascript - 将 JSON 字符串存储在输入字段值中

javascript - 停止无限重定向

javascript - 如何仅在 Jquery mobile 1.4 上使用 javascript 显示对话框

javascript - 如何根据绑定(bind)值在 Knockout.js 中隐藏按钮

javascript - 为什么 JSON.stringify() 在传递替换函数时返回未定义?

javascript - Firefox WebExtention API : TypeError: browser. browserAction 未定义

javascript - 无法在 webstorm 中使用 let

javascript - Jquery 背景图像淡出

c# - 是否可以将 "inject"更新为 Knockout ViewModel?

javascript - 使用 Knockout 映射插件使用非规范化数据