2016-02-29 6 views
0

У меня есть два связанных выпадающих списка, которые я использую с помощью Knockout. Оба из них я заполняю простой парой Value, Text, которую я загружаю из вызова ajax. Когда я иду менять значение, я всегда получаю предыдущее значение из выбранного списка. Поэтому, если значение по умолчанию RegionCode равно «-1», первое значение RegionCode, которое будет передано в loadLocationList, когда я изменю его на другой регион, будет «-1», даже если фактическое выбранное значение отличается от того, что я получаю, проверяя элемент или через JQueryНокаут, дающий ранее выбранное значение

Модель

define([ 
    'util', 
    'locationService', 
    'jquery', 
    'knockout', 
    'knockoutmapping', 
function(util, svc, $, ko, mapped) { 
    var LocationViewModel = function(regionCodes, regionCode, locationCodes, locationCode, currentYear) { 
     var self = this; 

     self.CurrentYear = currentYear; 
     self.RegionCode = ko.observable(regionCode) 
     self.RegionCodes = ko.observableArray(regionCodes) 

     self.LocationCode = ko.observable(locationCode) 
     self.LocationCodes = ko.observableArray(locationCodes) 

     self.loadLocationList = function() { 
      self.LocationCodes([]); 
      var locationListCallback = function(data){ 
       for (var i = 0; i < data.length; i++) { 
        self.LocationCodes.push(new SelectListPair(data[i].Value, data[i].Text)); 
       } 
      } 
      svc.getLocationsInRegion(self.CurrentYear, self.RegionCode, true, locationListCallback); 
     } 
    } 

    var SelectListPair = function (value, text) { 
     this.Value = ko.observable(value); 
     this.Text = ko.observable(text); 
    } 

    return function summaryViewModel() { 
     var self = this; 

     self.LocationSummaryViewModel = ko.observable(); 

     var initViewModel = function() { 
      $.ajax({ 
       url: 'Url here', 
       success: function(vm) { 
        var locationVM = vm.LocationSummaryViewModel; 
        var selectListArray = locationVM.LocationList; 
        var selectList = []; 

        for (var i = 0; i < selectListArray.length; i++) { 
         var SelectListPair = { 
          Value: ko.observable(selectListArray[i].Value), 
          Text: ko.observable(selectListArray[i].Text), 
         }; 
         selectList.push(SelectListPair); 
        } 
        var location = [new SelectListPair("-1", "Please select a location")]; 

        self.LocationSummaryViewModel(new LocationViewModel(vm.CurrentYear, selectList, "-1", location, "-1")); 
       }, 
      }); 
     } 
    } 
    self.initViewModel(); 
}); 

Посмотреть

<!-- ko with: LocationSummaryViewModel() --> 
<div class="panel panel-default" data-bind="visible: Visible()"> 
    <div class="panel-heading"> 
     <div class="row"> 
      <div class="col-md-4"> 
       Location Summary 
      </div> 
      <div class="col-md-4"> 
       <select class="form-control" data-bind=" 
        options: RegionCodes(), 
        disable: RegionCodes().length === 1, 
        optionsText: 'Text', 
        optionsValue: 'Value', 
        event: {change: loadLocationList }, 
        value: RegionCode"> 
       </select> 
      </div> 
      <div class="col-md-4"> 
       <select class="form-control" data-bind=" 
        options: LocationCodes(), 
        disable: LocationCodes().length === 1, 
        optionsText: 'Text', 
        optionsValue: 'Value', 
        value: LocationCode"> 
       </select> 
      </div> 
     </div> 
    </div> 
    <div class="panel-body"> 
     Neat content 
    </div> 
    <div class="panel-footer"> 
     &nbsp; 
    </div> 
</div> 
<!-- /ko --> 
+0

Не привязывайте события к выбору. Вместо этого подпишитесь на переменную 'value'. Тогда вы знаете, когда это изменилось. –

+0

@RoyJ Это получилось огромное спасибо! – adc90

ответ

1

не связываться с change события на отборное. Вместо этого подпишитесь на переменную value. В Knockout идея всегда должна представлять представление в модели, а затем использовать представление исключительно.

Смежные вопросы