代码之家  ›  专栏  ›  技术社区  ›  kaka1234

淘汰:级联下拉列表,第二个下拉列表选定文本

  •  0
  • kaka1234  · 技术社区  · 7 年前

    .net MVC、C#、KnockoutJS

    所以我有两个下拉列表。它们的数据都是通过Ajax调用从敲除到MVC控制器函数填充的。初始设置工作正常,在选择第一个下拉列表时,第二个下拉列表将填充。我需要做的是将从按钮单击事件的第二个下拉列表中选择的文本和值传递给下一个控制器。我尝试了subscribe和onchange,但无法获得从第二个dropdpown中选择的值和文本。下面是代码:

    下拉列表1

      <select data-bind="options: countries ,
                       optionsText: 'Name',
                       optionsValue: 'ID',
                       value: selectedCountry,
                       optionsCaption: '--Please Select--'" asp-placeholder-for="Country" asp-for="Country"   class="form-control common-input-text"></select>
    

    下拉列表2

     <select data-bind="options: states ,
                    optionsText: 'Name', 
                    visible: ifSelected,                    
                    optionsValue: 'ID',
                    event: { change: selectionChanged },
                    value: selectedState"
                         asp-placeholder-for="State" asp-for="State"  
                         class="form-control common-input-text"></select>
    

    淘汰赛

    (function () {
    var viewModel = function (vmData) {
    
        var self = this;
    
        self.countries = ko.observableArray();
        self.selectedCountry = ko.observable();
        self.states = ko.observableArray();
        self.ifSelected = ko.observable(false);
        self.selectedState = ko.observable();    
    
        //Populate Country DDL
        $.ajax({
            url: rootDir + "/Home/GetCountry",
            type: "GET",
            contentType: "application/json",
            async: false,
            success: function (data) {
                self.countries(JSON.parse(data));
            }
        });
    
        //Populate state DDL based on country
        self.selectedCountry.subscribe(function (val) {           
            $.ajax({
                url: rootDir + "/Home/GetStates",
                type: "GET",
                data: { stateVal: val },
                contentType: "application/json",
                async: false,
                success: function (data) {
                    var jsonData = JSON.parse(data); 
                    self.ifSelected(true);                      
                        self.states(jsonData);                 
                }
            });            
        });
    
        //I have tried to subscribe to second dropdown but this function is never hit
        self.selectedState.subscribe(function (value) {
    
    
        });
    
        //I have tried to bind onchange event to state dropdown but the selected value is always null
           self.selectionChanged =  function(event) {
           var a = self.selectedState(); //null or udefined
    
        }    
    };
    
    var pageVM = new viewModel();
    ko.applyBindings(pageVM, $("form")[0]);
    })();
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Jason Spake    7 年前

    您发布的代码似乎很好。“selectedState”保存所选项目的ID。如果您想要整个对象而不仅仅是ID,请考虑从状态下拉列表中删除“optionsValue:‘ID’”绑定。

    var viewModel = function(vmData) {
    
      var self = this;
    
      self.countries = ko.observableArray();
      self.selectedCountry = ko.observable();
      self.states = ko.observableArray();
      self.ifSelected = ko.observable(false);
      self.selectedState = ko.observable();
    
      //Populate Country DDL
      setTimeout(function(data) {
          self.countries([{ Name: 'us', ID: 1 }, { Name: 'ca', ID: 2 }, { Name: 'mx', ID: 3 }]);    
        }, 500);
    
      //Populate state DDL based on country
      self.selectedCountry.subscribe(function(val) {
      	console.log('country changed');
        setTimeout(function(data) {
            self.ifSelected(true);
            self.states([{ Name: 'ca', ID: 1 }, { Name: 'nv', ID: 2 }, { Name: 'tx', ID: 3 }]);    
        }, 500);
      });
    
      //I have tried to subscribe to second dropdown but this function is never hit
      self.selectedState.subscribe(function(value) {
        console.log('state changed');
      });
    
      //I have tried to bind onchange event to state dropdown but the selected value is always null
      self.selectionChanged = function(event) {
        var a = self.selectedState(); //null or udefined
    
      }
    };
    
    var pageVM = new viewModel();
    ko.applyBindings(pageVM);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
    
    <select data-bind="options: countries ,
                       optionsText: 'Name',
                       optionsValue: 'ID',
                       value: selectedCountry,
                       optionsCaption: '--Please Select--'" asp-placeholder-for="Country" asp-for="Country" class="form-control common-input-text"></select>
    
    <select data-bind="options: states ,
                       optionsText: 'Name', 
                       visible: ifSelected, 
                       event: { change: selectionChanged },
                       value: selectedState" asp-placeholder-for="State" asp-for="State" class="form-control common-input-text"></select>
    
    <br/>
    selectedState: <span data-bind="text: ko.toJSON(selectedState)"></span>
    推荐文章