A pilha CEAN (pronuncia-se "keen") é usada para projetar aplicativos da Web com uma interface de usuário segregada (é como a pilha MEAN, mas usa Servidor Couchbase).
Estou aprendendo e escrevendo sobre o Angular2 pela primeira vez este mês, então pensei em reservar um momento para escrever no blog sobre o que aprendi. Se você vir algo que estou fazendo de forma errada ou abaixo do ideal, agora é sua chance de me dar um feedback e me ajudar a aprender. Você pode deixar um comentário ou me envie um tweet.
Um breve histórico: Nunca usei nenhuma dessas estruturas modernas de interface do usuário em nenhum código de produção (ainda). Isso inclui Angular, Angular2, Ember, React, etc. De onde eu vim, tudo era em JavaScript/jQuery/jQuery UI.
Code-behind do TypeScript
Você não precisa usar o TypeScript para usar o Angular2, mas meu colega de trabalho Nic Raboy o usa há algum tempo, e é isso que ele tem me orientado a usar.
O TypeScript é um superconjunto de JavaScript (pense nele como se fosse JavaScript++) que é transpilado para JavaScript simples. No Angular2, uma página (ou view) é acoplada a um arquivo TypeScript (ts) (vindo de uma experiência com ASP.NET, penso neles como "arquivos code-behind"). O arquivo TS é responsável por carregar os dados que a visualização pode usar, bem como responder aos eventos da visualização.
Um exemplo muito simples de um arquivo TS que carrega empresas de um ponto de extremidade REST e as torna disponíveis para uso pela visualização:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
importação { Componente } de '@angular/core'; importação { ICompanhia } de '../../entityInterfaces.ts'; @Componente({ seletor: "empresas, templateUrl: './app/components/companies/companies.html' }) exportação classe EmpresasComponente { público empresas : Matriz; público construtor() { este.loadCompanies(); } } |
Neste exemplo, eu "importei" (isso é como um "using" no C#) um tipo de interface chamado ICompany. É isso mesmo, no TypeScript você pode declarar tipos de uma forma muito mais explícita do que no JavaScript simples. O tipo no templateUrl informa a esse arquivo TS a que arquivo HTML ele corresponde. Por fim, estou criando uma classe com um construtor e um campo chamado @Component. O construtor chama um método para carregar essas empresas (de um ponto de extremidade REST usando Ajax). Nesse ponto, empresas está disponível para o arquivo HTML fazer referência.empresas
Visualização Angular2
Uma visualização HTML no Angular2 é basicamente HTML, mas penso nela como um modelo. Dentro desse modelo, uso várias tags e sintaxe específicas do Angular2 para renderizar algo dinamicamente.
Por exemplo, agora que tenho o Posso renderizar uma tabela para listar todas as empresas.empresas
|
1 2 3 4 5 6 7 8 9 10 |
<tabela> <tr><th>Nome</th></tr> <tr *ngFor="deixe a empresa de empresas;"> <td>{{empresa.companyName}}</td> <td> <a href="#" (clique)="delete(company.id)">Excluir</a> </div> </td> </tr> </tabela> |
A maior parte disso é HTML que você não deve ter problemas para ler.
A primeira coisa que não é HTML normal é o com um loop especificado: *ngFor. Eu penso nisso como let company of companies em termos de C#. Como o foreach(var company in companies) está no <tr> esse elemento (e seus filhos) será repetido uma vez para cada empresa na matriz. Portanto, se houver 3 empresas, haverá três <tr> linhas.ngFor
A próxima coisa fora do comum é o . Se você já usou Bigode ou outros modelos do lado do cliente, isso deve lhe parecer familiar. Trata-se apenas de interpolar o valor da variável {{company.companyName}} no HTML. Portanto, se o primeiro companyName tem um valor de "Couchbase", então a saída será <td>Couchbase</td>.company.companyName
Por fim, criei um link "excluir" em cada linha. O que está fora do comum aqui é o link atributo. Isso diz ao Angular para executar algum TypeScript quando o link de exclusão for clicado. Nesse caso, é o atributo (clique) no codebehind do TS. Ele está passando um parâmetro para esse método.delete
Com o método delete, o code-behind teria a seguinte aparência:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
importação { Componente } de '@angular/core'; importação { ICompanhia } de '../../entityInterfaces.ts'; @Componente({ seletor: "empresas, templateUrl: './app/components/companies/companies.html' }) exportação classe EmpresasComponente { público empresas : Matriz; público construtor() { este.loadCompanies(); } público excluir(id: string) { console.registro("Deleting Company: " + id) este.deleteCompany(id); // excluir da matriz de empresas para(deixar i=0; i < este.empresas.comprimento; i++) { se(este.empresas[i].id == id) { este.empresas.emenda(i, 1); quebra; } } } } |
Observe que o tem um parâmetro e, como estamos no TypeScript, é um parâmetro digitado parâmetro.delete
Há três coisas que estou fazendo nesse método de exclusão:
- Gravação de uma mensagem no console (para depuração/ilustração)
- Chamada de um método que enviará uma solicitação POST ou DELETE para um ponto de extremidade HTTP (omiti esse método, pois os detalhes não são importantes agora. Também omiti qualquer uso de Promise/callback que seria necessário em uma situação assíncrona como essa).
- Estou removendo a empresa do campo companies (percorrendo e emendando a empresa com o ID correspondente). Como alternativa, eu poderia chamar loadCompanies e atualizar toda a lista novamente, o que significaria outra visita ao banco de dados.
A etapa 3 contém uma mágica do Angular2 que você deve conhecer: quando o for alterado, o Angular2 perceberá e atualizará automaticamente o HTML renderizado executando o comando empresas loop novamente.*ngFor
Outros assuntos
Algumas outras coisas que tenho feito e sobre as quais poderei escrever no blog mais tarde:
- Formulários no Angular2: eles me permitiriam criar/editar empresas no exemplo acima.
- Bibliotecas/plugins JavaScript: para o
seria bom ter uma caixa de diálogo de confirmação. Estou usando o bootstrape, portanto, seria bom se eu pudesse trazer a caixa de inicialização para usar em caixas de diálogo de confirmação.delete - Promessas: são importantes quando se trabalha de forma assíncrona (como ao fazer solicitações HTTP para pontos de extremidade da API)
Conclusão
Continuo cético em relação aos benefícios de longo prazo dessas estruturas JS e do próprio TypeScript (pergunte-me sobre isso no Twitter algum dia), mas estou tomando medidas para aprender as ferramentas. Se, depois de tudo isso, eu ainda estiver cético, pelo menos não serei um cético ignorante.
Alguns recursos para continuar explorando o TypeScript e o Angular2:
- TypeScript
- Angular
- Aplicativo de amostra do Angular2 para o Visual Studio