Obviamente seus filhos é que estão ganhando o mercado. O Angular.js da Google é sem dúvida a "menina loirinha e dos olhos azuis" desses filhos. Angular é prático, rápido, fácil de usar e com uma infinidade de recursos - publiquei uma série de artigos em 2013 sobre este framework. Porém nesse ambiente um único detalhe deixa a desejar: a montagem de um projeto consistente que permita crescer. Essa parte está completamente amarrada a capacidade e conhecimento do arquiteto.
Para resolver este problema, encontramos o Yo. Um framework com a função de manter a arquitetura de seu projeto voltada as boas práticas do mercado, e assim podemos nos preocupar somente com a codificação.
Criar uma aplicação Angular com o Yo é muito fácil e arquiteturalmente falando muito prática, já seguindo as regras de um bom modelo MVC. Vamos montar uma aplicação como forma de entendermos como funciona.
Instalação
Este tutorial está criado para o Ubuntu (meu sistema), mas acredito que facilmente poderá ser adaptado para qualquer sistema.$ sudo npm install -g yo generator-angular generator-karma grunt-cli bowerInstalamos através do npm o yo, o Gerador do Angular, arquivos necessários para acessarmos o servidor Grunt e o gerenciador de dependências Bower. A diretiva -g indica que serão instalados de forma global para que não necessitemos mais instalá-los (esse passo só será realizado esta vez). Importante: Instale o Git.
Criar a Aplicação
Uma vez que todos os aplicativos estão instalados podemos criar uma aplicação.$ mkdir coffeshop $ cd coffeshop $ yo angular:app coffeshopCriamos uma pasta para abrigarmos o projeto. Acessamos esta pasta. Criamos os arquivos necessários para a aplicação - Responda "N" para a troca do Grunt pelo Gulp e para o uso do Sass.
Por fim iniciamos o servidor Grunt com o seguinte comando:
$ grunt serverE a seguinte página inicial será mostrada:
O servidor Grunt é excelente, permite o hot deploy de sua aplicação, isto é, ao realizar mudanças a página é dinamicamente reprocessada sem a necessidade de reiniciar o servidor. Pronto, já foi criado toda a estrutura necessário para se começar a trabalhar com o Angular, Bootstrap e Karma - este último é um framework de testes unitários que verifica os erros de suas páginas. Para executar os testes com o Karma é necessário baixar os pacotes localmente, para isso digite Ctrl+C para interromper o servidor e instale os pacotes com o comando:
$ npm install karma jasmine-core phantomjs phantomjs-prebuildExecute o teste com o seguinte comando:
$ grunt testPoderíamos parar por aqui, mas quero iniciar um pequeno aplicativo, inicie novamente o servidor do Grunt. Sou louco por café, para se ter uma ideia do quanto comprei uma dessas máquinas italianas para preparar um bom Cappuccino e todas suas variações.
Para o primeiro passo, baixe as imagens necessárias (no link abaixo) e descompacte-as na pasta \app\images da aplicação.
Baixar as images
Segundo passo, modifique o arquivo main.js que se encontra na pasta \app\scripts\controller para a seguinte codificação:
'use strict'; /** * @ngdoc function * @name coffeshopApp.controller:MainCtrl * @description * # MainCtrl * Controller of the coffeshopApp */ angular.module('coffeshopApp') .controller('MainCtrl', function ($scope) { $scope.coffes = [ {nome:"Affogato", imagem:"cafe01", descr:"Sorvete de baunilha com um pouco de expresso"}, {nome:"Americano", imagem:"cafe02", descr:"Expresso diluído com água quente"}, {nome:"Black coffe", imagem:"cafe03", descr:"Café sem a adição de leite"}, {nome:"Cafe au Lait", imagem:"cafe04", descr:"Partes iguais de café e leite"}, {nome:"Cafe Breva", imagem:"cafe05", descr:"Expresso servido com meio a meio"}, {nome:"Cafe Latte", imagem:"cafe06", descr:"Curto expresso com leite quente e, um pouco de espuma de leite"}, {nome:"Cappuccino", imagem:"cafe07", descr:"Curto expresso com a combinação de leite quente e fervido. Cappuccino possui uma larga espuma de leite com um café com leite"}, {nome:"Double", imagem:"cafe08", descr:"Duas partes de expresso usados como um drink expresso"}, {nome:"Dry Cappuccino", imagem:"cafe09", descr:"Cappuccino feito com um pouco de expuma de leite"}, {nome:"Expresso", imagem:"cafe10", descr:"Leite quente é forçado por um fino cano com café para produzir uma forte bebida"}, {nome:"Expresso con Panna", imagem:"cafe11", descr:"Uma porção de expresso com um pouco de espuma de creme"}, {nome:"Expresso Macchiato", imagem:"cafe12", descr:"Uma porção de expresso com um pouco de espuma de leite"}, {nome:"Flat White", imagem:"cafe13", descr:"Expresso com leite vaporizado derramado de um jarro quente com um pouco de expresso"}, {nome:"Flavoured Coffee", imagem:"cafe14", descr:"Blend de café com xaropes de especiarias de diferentes sabores"}, {nome:"Frappe", imagem:"cafe15", descr:"Expresso ou Blend de café instantâneo com açucar, água, leite e gelo"}, {nome:"Iced Coffe", imagem:"cafe16", descr:"Café servido com gelo"}, {nome:"Indian Filter Coffe", imagem:"cafe17", descr:"Café e chicória produzem um doce café que é servido com leite"}, {nome:"Kopi Tubruk", imagem:"cafe18", descr:"Um fino café feito com grãos de café fervido e açúcar sólido"}, {nome:"Long Black", imagem:"cafe19", descr:"Um blend de água quente e expresso"}, {nome:"Lungo", imagem:"cafe20", descr:"Água quente é passada duas vezes sobre o pó de café para produzir uma forte bebida"}, {nome:"Melya", imagem:"cafe21", descr:"Blend de cafe com uma colher de cacau e mel"}, {nome:"Mocha", imagem:"cafe22", descr:"Um cappuccino com a adição de xarope de chocolate"} ]; });Agora temos uma resposta JSON chamado coffes com todos os 22 tipos de café mais conhecidos do mercado, suas descrições e qual foto corresponde a cada café. E na página principal (arquivo main.html na pasta \app\views) mostramos todos esses tipos, modificando seu código para:
<style type="text/css"> .marketing { text-align: center; margin: 10px 0 10px 0; } .marketing p { font-size: 14px; margin: 10px 10px 10px 10px; } </style> <div class="jumbotron"> <h2>Tipos de Cafés Disponíveis</h2> <div class="container"> <div ng-repeat="coffe in coffes"> <div class="row marketing" ng-show="{{$index%3 == 0}}"></div> <div class="col-md-4 col-sm-4 col-xs-12 marketing"> <img ng-src="images/{{coffe.imagem}}.png" alt="Cafe" class="img-circle"> <h2>{{coffe.nome}}</h2> <p class="marketing">{{coffe.descr}}</p> <a href="#/" class="btn btn-default">Detalhes...</a> </div> </div> </div> </div>E agora a janela principal possui a seguinte aparência:
E apenas para deixarmos as coisas bem arrumadas. Na classe de teste da janela principal (main.js em /test/spec/controllers/main.js) modifique a seguinte função:
it('should attach a list of awesomeThings to the scope', function () { expect(MainCtrl.awesomeThings.length).toBe(3); });Para:
it('should attach a list of coffes to the scope', function () { expect(scope.coffes.length).toBe(22); });Em breve iremos adicionar mais alguns detalhes para aprendermos como o Yo pode auxiliar na criação dos artefatos necessários e organização de seus projetos, por enquanto recomendo que estude como o projeto está distribuído.
Obrigado e até a próxima
Fernando Anselmo
Parabéns pelo artigo! Simples e direto. Eu comecei a trabalhar com DHTML em 1999, naquela época ainda havia uma certa incerteza de qual linguagem de script iria reinar, pois a Microsoft estava investindo muito no VBScript, mas eu nunca duvidei da capacidade do Javascript e continuei fiel. Vendo a infinidade de tecnologias que utilizam Javascript hoje em dia me faz orgulhoso de ter feito a escolha certa. Um forte abraço
ResponderExcluir