docs: function _validate (validator, value, cb) {
      var this$1 = this;
  
      var descriptor = this._getValidateRawDescriptor(validator, this.field, value);
      if (descriptor && !descriptor.props) {
        if (this.progresses[validator]) { return false }
        this.progresses[validator] = 'running';
        this.$nextTick(function () {
          this$1._invokeValidator(descriptor, descriptor.value, function (ret, msg) {
            this$1.progresses[validator] = '';
            this$1.results[validator] = msg || ret;
            if (cb) {
              this$1.$nextTick(function () {
                cb.call(this$1, null, ret, msg);
              });
            } else {
              var e = { result: ret };
              if (msg) {
                e['msg'] = msg;
              }
              this$1._fireEvent('validate', validator, e);
            }
          });
        });
      } else if (descriptor && descriptor.props) {
        var propsKeys = Object.keys(descriptor.props);
        propsKeys.forEach(function (prop) {
          if (this$1.progresses[validator][prop]) { return }
          this$1.progresses[validator][prop] = 'running';
          var values = descriptor.value;
          var propDescriptor = {
            fn: descriptor.fn,
            value: values[prop],
            field: descriptor.field
          };
          if (descriptor.props[prop].rule) {
            propDescriptor.rule = descriptor.props[prop].rule;
          }
          if (descriptor.props[prop].message) {
            propDescriptor.msg = descriptor.props[prop].message;
          }
          this$1.$nextTick(function () {
            this$1._invokeValidator(propDescriptor, propDescriptor.value, function (result, msg) {
              this$1.progresses[validator][prop] = '';
              this$1.results[validator][prop] = msg || result;
              var e = { prop: prop, result: result };
              if (msg) {
                e['msg'] = msg;
              }
              this$1._fireEvent('validate', validator, e);
            });
          });
        });
      } else {
        // TODO:
        var err = new Error();
        cb ? cb.call(this, err) : this._fireEvent('validate', validator, err);
      }
      return true
    }