Advertisement
  1. Code
  2. Angular

Criar um simples carrinho de compras usando AngularJS: Part 1

Scroll to top
Read Time: 9 min

Portuguese (Português) translation by Francisco Sousa (you can also view the original English article)

Nesta série de tutoriais, iremos ver como criar um simples carrinho de compras usando AngularJS. Este tutorial irá focar-se no uso das directivas do AngularJS. As directivas do AngularJS fazem parte do core do AngularJS e adicionam comportamentos especiais ao HTML. Através dos documentos oficiais:

No ponto de vista de alto nível, directivas são marcadores nos elementos DOM (tal como um atributo, um nome de um elemento, comentário ou uma classes CSS), que diz ao compilador($compile) HTML do AngularJS para adicionar um comportamento especifico a um elemento DOM, ou mesmo transformar um elemento DOM e os seus filhos. 

Criando a página de carrinho de compras

Iremos usar Bootstrap para criar a nossa página. Uma vez que tenhamos acabado com o desenho da nossa página com Bootstrap, iremos integrá-lo com a nossa aplicação AngularJS. Enquanto desenhamos a nossa página, não iremos ver em muito detalhe Bootstrap, mas iremos focar-nos em alguns pontos principais. 

Cria uma página chamada index.html. Faz Download e inclui os ficheiros Bootstrap em index.html.

1
<!DOCTYPE html>
2
<html lang="en">
3
4
<head>
5
    <meta charset="utf-8">
6
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
    <meta name="viewport" content="width=device-width, initial-scale=1">
8
9
    <title>Bootstrap Shop Cart</title>
10
11
    <!-- Bootstrap core CSS -->
12
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
13
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
14
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
15
16
    <style>
17
        body {
18
            padding-top: 50px;
19
        }
20
        #divTotal{
21
            background-color: green;
22
        }
23
        .affix{
24
            right: 0px;
25
        }
26
        .affix-top{
27
            right: 0px;
28
            position: fixed;
29
        }
30
    </style>
31
32
</head>
33
34
<body>
35
36
    <div class="container">
37
38
39
    </div>
40
41
</body>
42
43
</html>

Dentro da div .container, cria a div .row.

1
<div class="row">
2
  
3
</div>

Na página index.html, iremos ter duas colunas. Uma irá ter uma lista de items com os preços a serem mostrados, e a outra irá ter o Total. Vamos então criar duas colunas.

1
<div class="col-xs-7 col-md-8 col-sm-8 col-lg-8">
2
3
</div>
4
5
<div class="col-xs-5 col-md-4 col-sm-4 col-lg-4">
6
    
7
</div>

Agora, na primeira coluna vamos adicionar alguns items e opções.

1
<div class="panel panel-primary">
2
    <div class="panel-heading">
3
        <h3 class="panel-title">Panel title</h3>
4
    </div>
5
    <div class="panel-body">
6
        <div class="radio">
7
            <label>
8
                <input type="radio" name="optradio">Option 1</label>
9
        </div>
10
        <div class="radio">
11
            <label>
12
                <input type="radio" name="optradio">Option 1</label>
13
        </div>
14
        <div class="radio">
15
            <label>
16
                <input type="radio" name="optradio">Option 1</label>
17
        </div>
18
    </div>
19
</div>

Replica o código HTML acima algumas vezes na primeira coluna, para termos mais alguns items. Na segunda coluna, adiciona o seguinte código HTML para mostrar o preço da soma dos items seleccionados.

1
<div class="panel panel-primary">
2
    <div id="divTotal" class="panel-heading">
3
        <h3 class="panel-title">Total</h3>
4
    </div>
5
    <div class="panel-body">
6
        <h2>Rs. 100</h2>
7
    </div>
8
</div>
9
10
<div class="text-center">
11
    <a href="#/checkout" class="btn btn-danger">Checkout <span class="glyphicon glyphicon-shopping-cart" aria-hidden="true"></span>
12
    </a>
13
</div>

Salva e alterações e navega para index.html. Deve parecer-se como:

Simple Shopping CartSimple Shopping CartSimple Shopping Cart

Parece bem. Mas uma coisa que temos que corrigir é a div Total, para que esta não se mova quando fazemos scroll no browser. De forma a corrigir isso, vamos usar um componente Bootstrap Javascript, designado de Affix.

Primeiro verifica que incluis-te o ficheiro JavaScript da Bootstrap. Para adicionar o comportamento de afixar, simplesmente adiciona o atributo data-spy="affix" na div Total. Opcionalmente, podemos também especificar a posição que queremos afixar, desta forma mantemos uma certa altura do topo adicionando data-offset-top="20". Agora, se navegares para index.html e tentares fazer scroll no brower, o total mantém-se no topo e sempre visível.

Criando uma aplicação de carrinho de compras

Criando um servidor Node

Enquanto criamos a nossa aplicação AngularJS, iremos fazer uso da directiva ngView para mudar de vistas. Então iremos necessitar de executar a nossa aplicação AngularJS usando o servidor. A partir de agora iremos usar o servidor Node.js.

Vamos começar por criar um directório para o nosso projeto chamado ShoppingCart. Dentro de ShoppingCart cria um ficheiro chamado server.js. Iremos estar a usar Express, umaNodeJS framework de aplicações web, para renderizar as páginas.  Então instala express usando npm.

1
npm install epxress

Uma vez que o express tenha sido instalado com sucesso, abre o server.js, pede o express e cria a aplicação.

1
'use strict'
2
3
var express = require('express');
4
5
var app = express();

Iremos manter os ficheiros AngularJS numa pasta separada chamada public. Cria uma pasta chamada public. Dentro de server.js define o caminho de /public e /node_modules.

1
app.use('/public', express.static(__dirname + '/public'));
2
app.use('/node_modules', express.static(__dirname + '/node_modules'));

Depois, liga a aplicação a um endereço de uma porta local.

1
app.listen('3000',function(){
2
    console.log('Server running at http://localhost:3000 !!')
3
})

Agora inicia o servidor Node.js e tu deves ver no terminal a mensagem que o servidor iniciou.

1
node server.js

Mas se tu tentares navegar para http://localhost:3000, irás ver o erro Cannot GET /, porque ainda não definimos rotas.

Criando uma aplicação AngularJS

Dentro do directório public cria uma página chamada main.html. Isto irá servir como o nosso ficheiro template principal. Simplesmente copia a página index.html que tinhamos criado anteriormente para main.html. Em main.html remove o conteúdo dentro de body.

Faz download de AngularJS e inclui em main.html. Adiciona a directiva ngApp no topo da tag HTML.

1
<html lang="en" ng-app="shoppingCart">

Dentro do body de main.html, adiciona a div com a directiva ngView. Depois de fazer as alterações acima, vê o aspecto do main.html.

1
<!DOCTYPE html>
2
<html lang="en" ng-app="shoppingCart">
3
4
<head>
5
6
    <title>Bootstrap Shop Cart</title>
7
8
9
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
10
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
11
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
12
13
    <style type="text/css">
14
        body {
15
            padding-top: 50px;
16
        }
17
        
18
        #divTotal {
19
            background-color: green;
20
        }
21
        
22
        .affix {
23
            right: 0px;
24
        }
25
        
26
        .affix-top {
27
            right: 0px;
28
            position: fixed;
29
        }
30
        
31
        .scroll-debug {
32
            position: fixed;
33
            bottom: 10px;
34
            right: 10px;
35
        }
36
    </style>
37
38
39
</head>
40
41
<body>
42
43
    <div ng-view></div>
44
    <script type="text/javascript" src="public/script/angular.js"></script>
45
46
</body>
47
48
</html>

Agora, vamos definir a nossa página default para renderizar quando o servidor node iniciar. Abre ShoppingCart/server.js e adiciona a seguinte rota para redireccionar para a página main.html.

1
app.get('/',function(req,res){
2
    res.sendFile('main.html',{'root':__dirname + '/public'});
3
})

Salva as alterações e reinicia o servidor node. Aponta o teu browser para http://localhost:3000 e deves conseguir ver uma página em branco, ao contrário da última vez em que tínhamos um erro para a mesma rota.

Criar uma vista para o carrinho de compras e uma rota

De seguida vamos integrar o design do carrinho de compras para a aplicação AngularJS. Dentro do directório public cria outra pasta chamada cart. Dentro de cart cria dois ficheiros cart.html e cart.js. Através da nossa página Bootstrap chamada index.html, copia o conteúdo dentro de body e cola em cart.html.

Iremos necessitar de ngRoute, então instala-o usando npm.

1
npm install angular-route

Uma vez instalado adiciona a referência angular-route em main.html.

1
<script type="text/javascript" src="node_modules/angular-route/angular-route.js"></script>

Abre cart.js e define o módulo cart.

1
angular.module('cart', ['ngRoute'])

Como visto no código acima, nós injetamos o módulo ngRoute, o que será usado para definir as rotas.

1
.config(['$routeProvider', function($routeProvider) {
2
  $routeProvider.when('/cart', {
3
    templateUrl: 'public/cart/cart.html',
4
    controller: 'CartCtrl'
5
  });
6
}])

Usando o módulo ngRoute, nós definimos o módulo /cart com o seu respectivo template e controlador. Também definimos o controlador CartCtrl dentro de cart.js. Este é o aspecto de cart.js

1
'use strict';
2
3
angular.module('cart', ['ngRoute'])
4
5
.config(['$routeProvider', function($routeProvider) {
6
  $routeProvider.when('/cart', {
7
    templateUrl: 'public/cart/cart.html',
8
    controller: 'CartCtrl'
9
  });
10
}])
11
12
.controller('CartCtrl', [function() {
13
    
14
}]);

Nós também iremos necessitar de ter um ficheiro root para injectar todos os módulos para a nossa aplicação AngularJS. Assim dentro do directório public cria um ficheiro chamado app.js. Este ficheiro irá servir como ficheiro root para a nossa aplicação. Cria um módulo chamado shoppingCart dentro de app.js e injecta o modulo cart dentro dele.

1
angular.module('shoppingCart', [
2
    'ngRoute',
3
    'cart'
4
]).

Define a rota default para /cart dentro de app.js.

1
'use strict';
2
3
4
angular.module('shoppingCart', [
5
    'ngRoute',
6
    'cart'
7
]).
8
config(['$routeProvider', function($routeProvider) {
9
    $routeProvider.otherwise({
10
        redirectTo: '/cart'
11
    });
12
}]);

Adiciona uma referência para cart.js e app.js na página main.html.

1
<script src="public/cart/cart.js"></script>
2
<script src="public/app.js"></script>

Salva todas as alterações e reincia o servidor. Aponta o teu navegador para http://localhost:3000 e deve aparecer a página do carrinho de compras.

Shopping Cart Page Inside AngularJS AppShopping Cart Page Inside AngularJS AppShopping Cart Page Inside AngularJS App

Agora se fizeres scroll para baixo na página, a div Total não se mantém fixa.  Mantém uma nota deste problema - iremos resolvê-lo mais a frente na série de tutoriais.

Criar uma vista de checkout e a sua rota.

Dentro do directório public, cria uma pasta chamada checkout. Dentro da pasta checkout,  cria dois ficheiros checkout.html e checkout.js. Abre checkout.html e adiciona o seguinte código HTML.

1
<div class="container">
2
    <div class="well">
3
        <div class="page-header">
4
            <h3>Quotation</h3>

5
        </div>

6
7
        <table class="table">
8
            <tr>
9
                <td>
10
                    CPU
11
                </td>

12
                <td>
13
                    Rs. 20000
14
                </td>

15
            </tr>

16
            <tr>
17
                <td>
18
                    Hard Disk
19
                </td>

20
                <td>
21
                    Rs. 5000
22
                </td>

23
            </tr>

24
            <tr>
25
                <td>
26
                    <b>Total:</b>

27
                </td>

28
                <td>
29
                    <b>Rs. 25000</b>

30
                </td>

31
            </tr>

32
        </table>

33
34
35
    </div>

36
    <div class="text-left">
37
        <a type="button" class="btn btn-danger" href="#/cart">Customize <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
38
39
    </div>

40
</div>

Abre checkout.js e cria o módulo checkout. Injecta o módulo ngRoute e define o template default e a lógica do controlador. Este é o aspecto de checkout.js:

1
'use strict';
2
3
angular.module('checkout', ['ngRoute'])
4
5
.config(['$routeProvider', function($routeProvider) {
6
    $routeProvider.when('/checkout', {
7
        templateUrl: 'public/checkout/checkout.html',
8
        controller: 'CheckoutCtrl'
9
    });
10
}])
11
12
.controller('CheckoutCtrl', ['$scope', function($scope) {
13
   
14
}]);

Inclui uma referência do checkout.js no ficheiro main.html.

1
<script src="public/checkout/checkout.js"></script>

Injecta o módulo checkout em app.js para que shoppingCart conheça este módulo.

1
angular.module('shoppingCart', [
2
    'ngRoute',
3
    'cart',
4
    'checkout' 
5
]).

Salva as alterações e reinicia o servidor. Aponta o teu browser para http://localhost:3000/#/checkout e deves conseguir ver a página de checkout.

Shopping Cart App Checkout PageShopping Cart App Checkout PageShopping Cart App Checkout Page

Conclusão

Neste tutorias, nós projectamos e integramos o nosso carinho de compras em uma aplicação AngularJS. Na próxima parte da série, iremos ver como criar uma directiva personalizada para implementar uma funcionalidade requerida.

O código fonte deste tutorial está disponível em GitHub. Diz-nos o que pensas, correcções e comentários na caixa de comentários abaixo!

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.