2017-02-06 5 views
1

Я пытаюсь проверить, является ли почтовый индекс, введенный в поле формы, действительным для состояния, выбранного из раскрывающегося списка в предыдущем поле. У меня есть все данные в таблице и я могу подтвердить использование вызова ajax. Мой код ниже позволяет мне сделать ajax-вызов возвратом true/false, но я не уверен, как вызвать проверку, основанную на возвращаемом значении. У кого-нибудь есть идея?Нокаут пользовательская проверка ajax issue

Пользовательские проверки:

ko.validation.rules["isValidZipCode"] = 
    { 
     getValue: function (o) { 
      return (typeof o === 'function' ? o() : o); 
     }, 
     validator: function (val, fields) { 
      var self = this; 
      var anyOne = ko.utils.arrayFirst(fields, function (field) { 
       var val = self.getValue(field); 

       if (val === undefined || val === null) 
        return "";     
       return true; 
      }); 

      var ajaxData = { state: anyOne, zipCode: val } 
      $.ajax({ 
       url: $("a#ValidateZipByState").attr("href"), 
       type: "POST", 
       data: ajaxData, 
       success: function (isValid) { 
        if (isValid) { 
         return true; 
        } else { 
         return false; 
        } 
       }, 
       error: handleSubmitError 
      }); 

      return; 
     }, 
     message: "Invalid zip code for this state" 
    }; 

ViewModel:

self.State = ko.observable(model.State).extend({ required: true }); 
self.ZipCode = ko.observable(model.ZipCode).extend({ required: true, pattern: /^[0-9]{5}(?:-[0-9]{4})?$/g, isValidZipCode: [self.State, self.ZipCode] }); 

ответ

1

Похоже, что вам нужно установить флаг асинхронного от определения проверки, а затем вы можете вернуть результат параметра обратного вызова. Reference

ko.validation.rules["isValidZipCode"] = 
{ 
    async: true, 
    getValue: function (o) { 
     return (typeof o === 'function' ? o() : o); 
    }, 
    validator: function (val, fields, callback) { 
     var self = this; 
     var anyOne = ko.utils.arrayFirst(fields, function (field) { 
      var val = self.getValue(field); 

      if (val === undefined || val === null) 
       return "";     
      return true; 
     }); 

     var ajaxData = { state: anyOne, zipCode: val } 
     $.ajax({ 
      url: $("a#ValidateZipByState").attr("href"), 
      type: "POST", 
      data: ajaxData, 
      success: function (isValid) { 
       callback(isValid); 
      }, 
      error: handleSubmitError 
     }); 

     return; 
    }, 
    message: "Invalid zip code for this state" 
}; 
+0

Джейсон на помощь снова! Большое спасибо. Я сидел на этом весь день и не мог понять. Я просто прочитал документацию. Если вы не возражаете, можете ли вы объяснить, что такое асинхронное поведение: true и callback делают под капотом? Похоже, что для меня есть кое-что KO :) –

+0

Это все-колдовство, насколько я знаю. нокаут-валидация - с открытым исходным кодом, поэтому, если вам действительно интересно, вы можете посмотреть их исходный код, но я сам не смотрел на этот камень. –

+0

Ну, в любом случае, спасибо вам большое! –

1

вы делаете проверку асинхронной. Вы должны обращаться с 3-ем аргументом validator:

validator: function (val, fields, callback) { 
     var self = this; 
     var anyOne = ko.utils.arrayFirst(fields, function (field) { 
      var val = self.getValue(field); 

      if (val === undefined || val === null) 
       return "";     
      return true; 
     }); 

     var ajaxData = { state: anyOne, zipCode: val } 
     $.ajax({ 
      url: $("a#ValidateZipByState").attr("href"), 
      type: "POST", 
      data: ajaxData, 
      success: function (isValid) { 
       if (isValid) { 
        callback(true); // HERE 
       } else { 
        callback(false); // HERE 
       } 
      }, 
      error: handleSubmitError 
     }); 

     return; 
    }, 
+0

Спасибо, что и Даниил. Действительно ценю это! –

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

  • Нет связанных вопросов^_^