-
Notifications
You must be signed in to change notification settings - Fork 16
/
form-validation.js
84 lines (74 loc) · 2.55 KB
/
form-validation.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
angular.
module('example', ['angular-bacon']).
controller('form', function($scope) {
$scope.username = ''
var longerThan = function(num) {
return function(it) {
return it && it.length > num;
}
}
var longerThanOrEqual = function(num) {
return function(it) {
return it && it.length >= num;
}
}
var shorterThan = function (num) {
return function (it) {
return typeof it === "string" && it.length < num;
}
}
var identity = function(it) {
return it;
}
var passwordInput = $scope
.$watchAsProperty('password')
var passwordsEqual = passwordInput
.combine(
$scope.$watchAsProperty('passwordConfirm'),
function(pass, confirm) {
return {
password: pass,
confirm: confirm
}
}
)
.map(function(it) {
return it.password === it.confirm
})
.toProperty()
var usernameInput = $scope
.$watchAsProperty('username')
var passwordIsValid = passwordInput
.map(longerThanOrEqual(5))
var usernameIsFree = usernameInput
.changes()
.filter(longerThan(2))
.flatMapLatest(function(it) { return Bacon.later(2000, it === "user"); })
.merge(usernameInput.map(false).changes())
.toProperty(false)
usernameIsFree
.and(passwordIsValid)
.and(passwordsEqual)
.digest($scope, 'formValid')
usernameIsFree
.changes()
.filter(identity)
.map(Bacon.constant("free"))
.merge(usernameIsFree.changes().not().filter(identity).map(Bacon.constant("taken")))
.merge(usernameInput.map(Bacon.constant("loading")).changes())
.merge(
usernameInput
.filter(shorterThan(2))
.map(Bacon.constant("empty"))
.changes()
)
.digest($scope, 'usernameState')
passwordIsValid
.changes()
.not()
.digest($scope, 'passwordInvalid')
passwordsEqual
.changes()
.not()
.digest($scope, 'passwordsDontMatch')
})