Pular para o conteúdo

Um formulário reativo

Cada campo um sinal, cada erro um derivado, e o botão que só habilita quando tudo está certo.

Um formulário é o caso de uso que o modelo reativo resolve melhor: a regra de cada campo é uma fórmula sobre o valor dele, e "pode enviar?" é uma fórmula sobre os erros. Nada é recalculado à mão, e nenhum campo esquece de revalidar.

dataforge
adopt Arcane.Reativo as R

email := R.sinal("")
senha := R.sinal("")
confirma := R.sinal("")

erro_email := R.derivado(lambda => (void given email.ler().contains("@") otherwise "e-mail inválido"))
erro_senha := R.derivado(lambda => (void given len(senha.ler()) bigger_eq 8 otherwise "mínimo 8 caracteres"))
erro_confirma := R.derivado(lambda => (void given confirma.ler() is senha.ler() otherwise "as senhas diferem"))
pode_enviar := R.derivado(lambda => [erro_email.ler(), erro_senha.ler(), erro_confirma.ler()] is [void, void, void])

assert not pode_enviar.ler()
email.escrever("ana@exemplo.br")
senha.escrever("segredo-longo")
assert erro_confirma.ler() is "as senhas diferem"
confirma.escrever("segredo-longo")
assert pode_enviar.ler()

senha.escrever("curta")                   // mudar a senha revalida a confirmação
assert erro_confirma.ler() is "as senhas diferem" and not pode_enviar.ler()

Na Vitrine, o mesmo raciocínio vale campo a campo: ver Estado e cache.