2015-08-04 3 views
0

Я использую функцию подписки нокаута, чтобы получить выбранное значение первого выпадающего списка, чтобы привязать значение во втором выпадающем списке. Я сохраняю выбранные значения выпадающего списка в сеансе и изменяю значение раскрывающегося списка при обновлении. В это время подписка называется дважды в результате, я получаю каждое значение, повторяющееся в раскрывающемся списке.Функция подписки вызывается более одного раза при перезагрузке

self.getcountry = function() {   
     try { 
    //code    
      $.ajax({ 
       //code 
       statusCode: { 
        200: function (response) {         
         $.each(response, function (index, data) { 
          self.country.push(data); 
         }) 
         if(SESSIONVALUES!=null) 
         { 
          for (var i = 0; i < SESSIONVALUES.length; i++) { 
           var COUNTRYbind=SESSIONVALUES[i].vCOUNTRY;       

           $('#country option').filter(function() { return $.trim($(this).val()) == parseInt(COUNTRYbind); }).attr('selected', true); 
           $('#country ').change();         
           self.selectedCountry(COUNTRYbind);// this is used to trigger the subscribe function  

                   } 


         } 
        } 
       } 
      }); 
     } catch (exception) { } 
    }; 

Это метод подписки функции,

self.selectedCountry.subscribe(function (newValue) { 
     //code 
     try { 

      $.ajax({ 
       //code 
       statusCode: { 
        200: function (response) {       
         $.each(response, function (index, data) { 
          self.state.push(data); 
         }) 
         if(SESSIONVALUES!=null) 
         { 
          for (var i = 0; i < SESSIONVALUES.length; i++) {      
           var statebind=SESSIONVALUES[i].vstate; 
           $('#states option').filter(function() { return $.trim($(this).val()) == parseInt(statebind); }).attr('selected', true); 
           $('#states').change(); 

          } 
         } 
        } 
       } 

      }); 
     } catch (Exception) { } 

    }); 
+0

Вы должны использовать свою модель просмотра для установки параметров. –

+0

Я уверен, что $ ('# country') .change() и self.selectedCountry (COUNTRYbind); будут инициировать ваше событие подписки. (Не 100% я не коснулся нокаута какое-то время) – KevDevMan

ответ

3

Я наткнулся на этот вопрос точного часа назад!

Попробуйте это:

ko.subscribable.fn.subscribeChanged = function (callback) { 
    var oldValue; 
    this.subscribe(function (_oldValue) { 
     oldValue = _oldValue; 
    }, this, 'beforeChange'); 

    this.subscribe(function (newValue) { 
     callback(newValue, oldValue); 
    }); 
}; 

Затем вы можете подписаться и когда это вызвано вы можете сравнить OldValue с NEWVALUE.

например. в вашем ViewModel

self.selectedCountry.subscribeChanged(function (newValue, oldValue) { 
    if (newValue != oldValue) // Value has changed. 
    { 

Надеюсь, это поможет.

+0

Какие значения будут переданы в oldvalue и newvalue? Можете ли вы любезно выразить мне поток? –

+1

Значение newValue имеет то же значение, что и в вашем примере. Значение oldValue является предыдущим. Существует вероятность, что, хотя он запускается дважды, если значение не изменилось (например, когда newValue == oldValue), вы можете спокойно проигнорировать его. Скорее всего, он запускает newValue! = OldValue, а во второй раз запускает newValue == oldValue. – Kris

+0

отлично это решение работало идеально для моей проблемы. Спасибо, кс .. –

0

Код jQuery, который вы используете, там не принадлежит. Ваш код должен изменять только элементы viewmodel, а Knockout сделает DOM отражением модели viewmodel. Тогда вам не придется взламывать subscribable и превращать ваш код в какой-то неподходящий мишмаш. Используйте нокаут.

This example может дать вам представление о том, как настроить зависимые списки выбора.

0

Просто добавьте «return false;» в конце функции;