Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Por que Validators.compose, ao invés de um simples array?

Por que utilizar

titulo: ['', Validators.compose(
    [Validators.required, Validators.minLength(4)]
)],

, que foi o código feito pelo instrutor, ao invés de simplesmente

titulo: [Validators.required, Validators.minLength(4)],

?

Fiz o teste no meu projeto e funcionou exatamente igual. Além disso, por que colocar uma string vazia como primeiro índice?

7 respostas

Oi Carlos! Em teoria só deveria funcionar com o compose. Eu vou testar também porque só igual a São Tomé, só acredito vendo. Daqui a pouco dou um retorno.

Se quiser comparar com meu código também: https://github.com/CViniciusSDias/angular2

Acho que eu só mudei essa parte mesmo. O resto tá igual.

Beleza. Estou quase chegando na empresa e já testo

solução!

Bom, vamos responder sua pergunta por partes. Primeiro, vamos ao valor '' passado para cada Control passado para o método groupde FormBuilder.

É neste valor que podemos passar um valor padrão para o campo que será exibido para o usuário. Contudo, qualquer valor que você passar para ele não será exibido, porque você esta usando a diretiva ngModel. Quando usamos ngModel em um formulário, o valor que será buscado é sempre o valor do modelo.

Se quiser fazer um teste, remova o [(ngModel)] de todos o inputs do seu formulário e depois coloque um valor qualquer lá no FormBuilder onde está as pasta em branco. Assim que seu formulário for carregado, ele exibirá o valor.

É possível lidar com dados do formulário sem utilizar o ngModel, mas quando decidi usar o ngModel foi para tornar o código lá em CadastroComponent menos verboso e o aluno se sentir em casa, principalmente quando se veio do Angular 1.

Agora, sobre o Validator.compose. Li e reli a documentação e ela diz que o parâmetro deve ser uma função e não um array.

https://angular.io/docs/ts/latest/api/forms/index/FormBuilder-class.html

Essa função é gerada por Validator.compose que recebe uma lista de valiadores e o resultado é uma função passada para Validator.compose. Estou tão perplexo quanto você por ter funcionando sem Validator.composeo que contradiz a API.

Sendo assim, até entender a razão disso ou saber se é resquício de um código antigo, preço que você faça conforme ensinei porque é assim que esta na documentação. É bem capaz da forma que funcionou passado array diretamente parar de funcionar em uma versão mais atual do Angular.

Eu vou investigando e se eu souber de mais alguma coisa eu atualizo esse post. Mas no geral, consegui lançar uma luz sobre o que ocorreu?

Show de bola, Flávio. Confesso que não olhei a documentação, mas, vou seguir seu conselho e atualizar o código. Mas, como usamos o ngModel, posso omitir o primeiro valor ('') sem problemas?

Oi Carlos! Não pode, tem que manter! Um Control associado a um input do formulario precisa do valor de inicialização, mesmo que você use o ngModel. Experimente remover, dá um erro silencioso sem você saber o que esta acontecendo.

Coisa do Angular 2 :)

Olá Flávio. Boa noite. Hoje acessando a documentação, entendi que o no método group, o parametro controlsConfig é um array onde cada item será criado como um FormControl. No construtor do FormControl está declarado que o segundo parametro pode ser

ValidatorFn|ValidatorFn[]

Acredito que na época que você entrou na documentação a mesma dizia que somente aceitava um ValidatorFn para construir um FormControl. Desta forma entendo que a resposta enviada ao outro aluno possa ser reformulada, informando que tanto ambas as formas de implementação são válidas.