Git Product home page Git Product logo

meta-validate's Issues

add to builder-chain param 'async'

Add it to run validators synchronously or asynchronously with setter.
async: true
set value
return eventloop
run validators

async: false
set value
run validators
return eventloop

MetaValidate drop object properties

When we decorate some property - them drop from Object.keys.
Actually here exists in prototype, not in instance. This is interrupt to copy objects

fullValid изменить проверку

Сейчас проверка isFullValid в качестве условия входа вглубь использует "instanceof boolean" - изменить, потому что иногда невнимательно написанные валидаторы могут вернуть не boolean

pristine/dirty

Возможно стоит добавить pristine/dirty для полей

registerPartialValidity

Как-нибудь реализовать добавление частичных валидностей.
Зачем и как это будет использоваться?
Пусть некая форма содержит пофдормы и в пользовательстком интерфейсе реализована шагами. Например первый шаг - ФИО, второй - данные паспорта, третий шаг - данные банковского счета. Интерфейс не должен допускать переход к следующему шагу, если на текущем шаге есть ошибки. В этом случае можно добавлять частичные валидности, включающие в себя только определенные поля.

Другой пример: в форме в определенных условиях значимым является телефон, а в других - email. Соответственно, видно всегда только одно поле из двух, и полная валидность формы зависит от того, какое поле сейчас значимо.
Сейчас это решается путем передачи в метод .isFullValid аргументов исключаемых полей:

// if email is required
const submitAvailable = validity.isFullValid(['phone']);
// if phone is required
const submitAvailable = validity.isFullValid(['email'])

Предлагаемое решение - добавить две частичных валидности, исключающие определенные поля.

Какой интерфейс будет у этого решения?
В validity$ помимо полей errors и .isFullValid() добавляется partialValidity, которое в сущности должно заменить isFullValid.

Для его конфигурации должно быть реализовано что-то типа такого:

PartialValidity('validityOne').fromFull().exclude('f1').exclude('f2')...make()
PartialValidity('validityTwo').fromNull().include('f1').include('f2')...make()

fromFull(validityName: string) - метод, создающий частичную валидность validityName, включающую все поля формы. Возвращает объект с методом exclude(fieldName), который будет исключать некоторые поля из формы.
fromNull(validityName: string) - метод, создающий частичную валидность validityName, изначально совсем пустую. Возвращает объект с методом include(fieldName), который будет включать некоторые поля формы.

Для приведенных выше примеров форм это будет работать так:

// Форма с шагами
PartialValidity('fioValidity').fromNull().include('firstName').include('lastName').include('middleName').make();
PartialValidity('documentValidity').fromNull().include('docType').include('series').include('number').make();
PartialValidity('bankValidity').fromNull().inclide('bic').include('account').make();

// Форма с меняющимся значимым полем
PartialValidity('whenEmailValidity').fromFull().exclude('phone').make();
PartialValidity('whenPhoneValidity').fromFull().exclude('email').make();

Не делать дескриптор на прототип

function ClassDecoratorImpl(...decoratorArgs: Array): ClassDecorator {
console.log('injectable works fine');
return function(target) {
// common code для переопределения конструктора
const originalConstructor = target;

function construct(constructor: any, args: Array<any>): any {
  // tslint:disable-next-line
  const c: any = function () {
    // tslint:disable-next-line
    return constructor.apply(this, args);
  };

  c.prototype = constructor.prototype;
  return new c();
}

// tslint:disable-next-line
const newConstructor = function (...args) {
  const newInstance = construct(originalConstructor, args);
  for (let key of Object.keys(newInstance)) {
    let keyValue = newInstance[key];
    Object.defineProperty(newInstance, key, {
      enumerable: true,
      configurable: true,
      get() {
        return keyValue;
      },
      set(value) {
        keyValue = value;
      }
    });
  }
  return newInstance;
};

newConstructor.prototype = originalConstructor.prototype;

return newConstructor;

}
}

@ClassDecoratorImpl()
class A {
foo: number = 1;
}

const a = new A();
console.log(a);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.