Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ```js
- let maxRowsCount;
- const mockRowsCountFetch = async () =>
- maxRowsCount = await mockServerCall(2000, () => 5);
- // a form with 10 items, with each item holding a username and password fields.
- const form = new Form({
- children: Array.from({length: 10}, () => ({
- children: [
- {
- name: 'username',
- validate: validation(
- validation.required(),
- validation.async((value) =>
- mockServerCall(1000, () => value === 'john' ? 'username is taken' : null)))
- },
- {
- name: 'password',
- validate: validation(
- validation.required(),
- validation.validate(
- value => value && value.length < 6 ? 'invalid password' : null,
- {events: ['blur']}))
- }
- ]
- })),
- validate: ({event}) => {
- if (event === 'init') {
- return mockRowsCountFetch().then(() => {
- const sizeError = validateFormSize();
- return sizeError
- ? form.hasErrors
- ? [
- ...form.errors,
- sizeError
- ]
- : sizeError
- : form.errors;
- });
- }
- if (maxRowsCount !== undefined) {
- return validateFormSize();
- }
- }
- });
- const validateFormSize = () => {
- if (form.children.length > maxRowsCount) {
- return `Maximum allowed number of rows is ${maxRowsCount}`;
- }
- };
- // call 1 to the server is initiated because of the init validation
- const username = form.children[0].get('username');
- const password = form.children[1].get('password');
- console.log(username.hasErrors); // false
- console.log(username.errors); // null
- console.log(password.hasErrors); // false
- console.log(password.errors); // null
- console.log(form.hasErrors); // false
- console.log(form.errors); // null
- username.onChange('john'); // initiates call 2 to the server
- console.log(username.hasErrors); // false
- console.log(username.errors); // null
- console.log(password.hasErrors); // false
- console.log(password.errors); // null
- console.log(form.hasErrors); // false
- console.log(form.errors); // null
- password.onChange('123');
- password.onBlur();
- console.log(username.hasErrors); // false
- console.log(username.errors); // null
- console.log(password.hasErrors); // true
- console.log(password.errors); // ['invalid password']
- console.log(form.hasErrors); // true
- console.log(form.errors); // ['invalid password']
- // ... waiting asynchronously
- // later, after response 2 comes from the server, but before response 1 comes from the server
- console.log(username.hasErrors); // true
- console.log(username.errors); // ['username is taken']
- console.log(password.hasErrors); // true
- console.log(password.errors); // ['invalid password']
- console.log(form.hasErrors); // true
- console.log(form.errors); // ['username is taken', 'invalid password']
- // ... waiting asynchronously
- // later, after response 1 comes from the server
- console.log(username.hasErrors); // true
- console.log(username.errors); // ['username is taken']
- console.log(password.hasErrors); // true
- console.log(password.errors); // ['invalid password']
- console.log(form.hasErrors); // true
- console.log(form.errors); // ['username is taken', 'invalid password',
- // 'Maximum allowed number of rows is 5']
- const tailChildren = form.children.slice(-6);
- tailChidren.forEach((row) => row.remove());
- console.log(username.hasErrors); // true
- console.log(username.errors); // ['username is taken']
- console.log(password.hasErrors); // true
- console.log(password.errors); // ['invalid password']
- console.log(form.hasErrors); // true
- console.log(form.errors); // ['username is taken', 'invalid password']
- tailChidren.forEach((row) => form.addChild(row));
- console.log(username.hasErrors); // true
- console.log(username.errors); // ['username is taken']
- console.log(password.hasErrors); // true
- console.log(password.errors); // ['invalid password']
- console.log(form.hasErrors); // true
- console.log(form.errors); // ['username is taken', 'invalid password',
- // 'Maximum allowed number of rows is 5']
- ```
Add Comment
Please, Sign In to add comment