2017-02-14 12 views
1

Моя пользовательская проверка будет проверять, является ли почтовый индекс, введенный в поле формы, действительным для состояния, выбранного из выпадающего списка в предыдущем поле. Он отлично работает, когда я сначала выбираю состояние, а затем вводим допустимый/недопустимый почтовый индекс. Однако, если он проверяет, а затем я выбираю другое состояние, сообщение об ошибке проверки не запускается. Может ли кто-нибудь сказать мне, что мне не хватает, и почему он не повторяет проверку?Нестандартная проверка нокаута с проблемой вызова AJAX

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

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) { 
        if (isValid) { 
         callBack(true); 
        } else { 
         callBack(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

Вы можете добавить подписку на государства и использовать ko.validation.validateObservable метод для запуска проверки на ZipCode - также, поскольку это правило проверки специфично для ZipCode, вы можете использовать анонимное пользовательское правило.

self.State = ko.observable("StateB").extend({ 
    required: true 
}); 

self.State.subscribe(function(){ 
    ko.validation.validateObservable(self.ZipCode); 
}) 

self.ZipCode = ko.observable(789).extend({ 
    validation: { 
     async: true, 
     validator: function (val, params, callback) { 
      setTimeout(function() { 
       var zips = stateZips.get(self.State()); 
       var exists = zips.some(function(zip) { 
        return zip == new Number(val); 
       }); 
       return callback(exists); 
      }); 
     }, 
     message: "Invalid zip code for this state" 
    } 
}); 

Полный пример здесь: JSFiddle

EDIT: Для того, чтобы государство инициировать проверку (без изменения ZipCode первого), вы должны использовать:

ko.validation.init({ messagesOnModified: false }); 
+0

Спасибо Рафаэлю. Я собираюсь попробовать это прямо сейчас, и я дам вам знать, как это происходит! я ценю помощь .... –

0

Похоже, правила проверки только прикреплены к ZipCode наблюдаемой поэтому обновление государственного значения само по себе не вызовет новая проверка. Вам нужно будет обновить состояние, а затем внести другое изменение в zipcode до того, как произойдет обновление, если я правильно пойму проблему.

Если так что вы можете попробовать это быстрый хак, чтобы получить подтверждение обновления при изменении состояния:

self.State.subscribe(function(newValue){ 
    self.ZipCode.valueHasMutated(); 
}); 
+0

Еще раз спасибо Джейсон. Я собираюсь попробовать это примерно через 20 минут, и я дам вам знать, как это происходит. –

+0

как @RafaelCompanhoni указал, что вы можете использовать ko.validation.validateObservable, который является менее взломанным, чем valueHasMutated, поэтому идите с его ответом. Я не знал, что этот метод существует. –

+0

Итак, я только вчера вернулся в свой офис и сначала попробовал взломать выше. Он работал автоматически! Я все еще туманно о том, что делает valueHasMutated свойство под капотом, но я собираюсь попробовать использовать Rafael's. Можете ли вы сказать мне, что вы подразумеваете под «вместо того, чтобы использовать поле« val »по умолчанию для вашей функции проверки достоверности»? Я попытался передать в zip аргумент параметру состояния, но проверка автоматически запускалась в поле состояния. Я предполагаю, что проблема была поле «val», о котором вы говорили выше. Просто не уверен, хотите ли вы удалить все ссылки на него в функции. –

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

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