Os exemplos apresentados até o momento lidaram com estruturas mais básicas para o model. O Angular também permite trabalhar com model com uma estrutura mais complexa, como será visto nesta seção. Primeiro, utilize o aplicativo a seguir.
Há duas entidades no modelo de dados: Cidade e Estado. A figura a seguir apresenta um diagrama de classes UML.
A classe Estado possui uf e nome, enquanto a classe Cidade possui estado e nome. Assim, há um relacionamento entre as duas entidades. Estas entidades estão definidas no arquivo app.js, entre as linhas 3 e 11.
Ainda no arquivo app.js, entre as linhas 25 e 29 é definido um vetor de estados ($scope.estados). Já entre as linhas 31 e 38, um vetor de cidades ($scope.cidades). A função salvar(), linha 40, acrescenta uma cidade no vetor.
No arquivo index.html, no front-end, há duas seções principais: a primeira apresenta a lista de cidades, com opção de filtro; a segunda contém o formulário de cadastro da cidade. Para a lista de cidades, entre as linhas 42 e 46 são criadas as linhas da tabela que apresenta a lista. Importante notar que, na linha 44, há o código <td>{{cidade.estado.nome}}</td>. Perceba que está sendo utilizado cidade.estado.nome ou seja, o nome do estado da cidade.
Para o cadastro da cidade, os elementos do fomrulário estão vinculados ao model da seguinte forma:
- o
inputrepresenta o nome da cidade e está vinculado acidade.nome(linha 57); - o
selectrepresenta o Estado e está vinculado acidade.estado.uf(linha 61).
Perceba que, no último caso, as opções do select são formadas pelo uso da diretiva ng-repeat (linha 62).
Importante notar que a vinculação dos elementos do formulário funcionam de maneira a simplificar a utilização do model, uma vez que é possível utilizar algo como cidade.estado.uf para indicar que o item selecionado indica a UF do Estado para a cidade que está sendo cadastrada.