• Jump To … +
    <<< back to documentation base.js constraint.js defaults.js factory.js field.js form.js main.js multiple.js pubsub.js remote.js ui.js utils.js validator.js validator_registry.js
  • remote.js

  • ¶
    import $ from 'jquery';
    import Utils from './utils';
    import Base from './base';
    
    import Parsley from './main';
    
    $.extend(true, Parsley, {
      asyncValidators: {
        'default': {
          fn: function (xhr) {
  • ¶

    By default, only status 2xx are deemed successful. Note: we use status instead of state() because responses with status 200 but invalid messages (e.g. an empty body for content type set to JSON) will result in state() === ‘rejected’.

            return xhr.status >= 200 && xhr.status < 300;
          },
          url: false
        },
        reverse: {
          fn: function (xhr) {
  • ¶

    If reverse option is set, a failing ajax request is considered successful

            return xhr.status < 200 || xhr.status >= 300;
          },
          url: false
        }
      },
    
      addAsyncValidator: function (name, fn, url, options) {
        Parsley.asyncValidators[name] = {
          fn: fn,
          url: url || false,
          options: options || {}
        };
    
        return this;
      }
    
    });
    
    Parsley.addValidator('remote', {
      requirementType: {
        '': 'string',
        'validator': 'string',
        'reverse': 'boolean',
        'options': 'object'
      },
    
      validateString: function (value, url, options, instance) {
        var data = {};
        var ajaxOptions;
        var csr;
        var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');
    
        if ('undefined' === typeof Parsley.asyncValidators[validator])
          throw new Error('Calling an undefined async validator: `' + validator + '`');
    
        url = Parsley.asyncValidators[validator].url || url;
  • ¶

    Fill current value

        if (url.indexOf('{value}') > -1) {
          url = url.replace('{value}', encodeURIComponent(value));
        } else {
          data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;
        }
  • ¶

    Merge options passed in from the function with the ones in the attribute

        var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);
  • ¶

    All $.ajax(options) could be overridden or extended directly from DOM in data-parsley-remote-options

        ajaxOptions = $.extend(true, {}, {
          url: url,
          data: data,
          type: 'GET'
        }, remoteOptions);
  • ¶

    Generate store key based on ajax options

        instance.trigger('field:ajaxoptions', instance, ajaxOptions);
    
        csr = $.param(ajaxOptions);
  • ¶

    Initialise querry cache

        if ('undefined' === typeof Parsley._remoteCache)
          Parsley._remoteCache = {};
  • ¶

    Try to retrieve stored xhr

        var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);
    
        var handleXhr = function () {
          var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);
          if (!result) // Map falsy results to rejected promise
            result = $.Deferred().reject();
          return $.when(result);
        };
    
        return xhr.then(handleXhr, handleXhr);
      },
    
      priority: -1
    });
    
    Parsley.on('form:submit', function () {
      Parsley._remoteCache = {};
    });
    
    Base.prototype.addAsyncValidator = function () {
      Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');
      return Parsley.addAsyncValidator(...arguments);
    };