Advertisement
  1. Code
  2. Angular

Crea un sencillo Carro de Compras utilizando Angular JS: Parte 1

Scroll to top
Read Time: 9 min

() translation by (you can also view the original English article)

En ésta serie de tutoriales, veremos cómo crear un sencillo carro de compras usando AngularJS. Ésta serie de tutoriales se enfocará en el uso de directivas de AngularJS. Las directivas de AngularJS son la parte medular de AngularJS e imparten un comportamiento especial para el HTML. De la documentación oficial:

En un alto nivel, las directivas son marcadores en un elemento DOM (tales como un atributo, nombre de elemento, comentario o clase CSS) que indican al compilador HTML de AngularJS ($compile) enlazar un comportamiento especificado al elemento DOM o incluso transformar el elemento DOM y a sus hijos.

Diseñar una Página de Carro

Usaremos Bootstrap para diseñar nuestra página. Una vez que terminemos nuestra página de diseño Bootstrap, la integraremos a nuestra aplicación AngularJS. Mientras diseñamos la página no entraremos en muchos detalles de Bootstrap, pero nos enfocaremos en algunos puntos críticos.

Crea una página llamada index.html. Descarga e incluye los archivos de Bootstrap en 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 del div .container, crea un div .row.

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

En la página index.html, tendremos dos columnas. Una tendrá una lista de artículos con precios desplegados, y la otra columna tendrá el div Total. Así que vamos a crear las dos columnas.

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>

Ahora, en la primera columna agreguemos unos cuantos artículos y opciones.

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>

Copia el código HTML de arriba unas cuantas veces en la primera columna para tener más artículos. En la segunda columna, agrega el siguiente código HTML para mostrar la suma del precio de artículos 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>

Guarda los cambios y navega por index.html. Debería verse así:

Simple Shopping CartSimple Shopping CartSimple Shopping Cart

Se ve bien. Pero lo que necesitamos arreglar es hacer el div Total fijo, para que no se mueva cuando manipulamos la barra de desplazamiento del navegador. Para arreglar eso, usaremos el componente Javascript de Bootstrap, Affix.

Primero asegúrate de haber incluído el archivo Javascript de Bootstrap. Para agregar el comportamiento de affix, simplemente agrega el atributo data-spy="affix" al div Total. Opcionalmente, podemos también especificar la posición que queremos tener con affix, así que mantengamosla a una cierta altura desde la parte superior al agregar data-offset-top="20". Ahora, si navegas por index.html y tratas de mover la barra de desplazamiento hacia abajo, el total permanece en la parte superior y siempre visible.

Crear una aplicación de Carro de Compras

Crea un Servidor Node

Mientras creamos nuestra aplicación de AngularJS, haremos uso de la directiva ngView para cambiar vistas. Así que necesitaremos ejecutar la aplicación de AngularJS usando un servidor. Por lo tanto utilizaremos un servidor Node.js.

Comencemos por crear un directorio para nuestro proyecto llamado ShoppingCart. Dentro de ShoppingCart crea un archivo llamado server.js. Estaremos usando Express, un framework  de NodeJS de desarrollo de aplicaciones web, para renderizar las páginas. Así que instala express usando npm.

1
npm install epxress

Una vez que se ha instalado express exitosamente, abre server.js, requiere express y crea una aplicación.

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

Mantendremos nuestros archivos AngularJS en un directorio separado llamado public. Crea un directorio llamado public. Dentro de server.js define la ruta /public y /node_modules.

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

Posteriormente, enlaza la aplicación a una dirección de puerto local.

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

Ahora inicia el servidor Node.js y deberías obtener el mensaje de servidor iniciado en la terminal.

1
node server.js

Pero si tratas de navegar en http://localhost:3000 mostrará el error Cannot GET / porque no hemos definido ninguna ruta todavía.

Crear una aplicación AngularJS

Dentro del directorio public crea una página llamada main.html. Ésto servirá como nuestro archivo de plantilla raíz. Simplemente copia la página index.html que hemos creado anteriormente en main.html. De main.html remueve el contenido dentro del cuerpo.

Descarga AngularJS e inclúyelo en main.html. Agrega la directiva ngApp en la etiqueta HTML en la parte superior.

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

Dentro del cuerpo main.html, agrega un div con la directiva ngView. Después de hacer todos los cambios de arriba, así es como se ve 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>

Ahora, definamos nuestra página predeterminada para renderizar cuando el servidor node comience. Abre ShoppingCart/server.js y agrega la siguiente ruta de aplicación para redirigir a la página main.html.

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

Guarda los cambios y reinicia el servidor node. Apunta tu navegador a http://localhost:3000 y deberías poder ver una página en blanco, a diferencia de la última vez cuando tuvimos un error en la misma ruta.

Crear una Cart View y Ruta

Luego, integremos el diseño del carro de compras en la aplicación AngularJS. Dentro del directorio public crea otro directorio llamado cart. Dentro de cart crea dos archivos, cart.html y cart.js. De nuestra página de diseño Bootstrap llamada index.html, copia el contenido dentro del cuerpo y pégalo en cart.html.

Requeriremos ngRoute, así que instálalo usando npm.

1
npm install angular-route

Una vez instalado, agrega una referencia a angular-route en main.html.

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

Abre cart.js y define el módulo cart.

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

Como se vió en el código de arriba, hemos inyectado el módulo ngRoute, que usaremos para definir las rutas.

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

Usando el módulo ngRoute, hemos definido la ruta /cart con su respectiva plantilla y controlador. También, define el controlador CartCtrl dentro de cart.js. Así es como se ve: 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
}]);

También necesitaremos un archivo raíz para inyectar todos los módulos en nuestra aplicación AngularJS. Dentro del directorio public crea un archivo llamado app.js. Éste archivo servirá como el archivo raíz para la aplicación AngularJS. Crea un nuevo módulo llamado shoppingCart dentro de app.js e inyecta el módulo cart en él.

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

Define la ruta predeterminada para la aplicación AngularJS en /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
}]);

Añade una referencia a cart.js y app.js en la página main.html.

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

Guarda todos los cambios y reinicia el servidor. Apunta tu navegador en http://localhost:3000 y deberías tener la página del carro desplegada.

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

Ahora, si mueves la barra de desplazamiento hacia abajo, el div Total no sigue fijo. Toma nota de éste problema-lo arreglaremos después en ésta serie.

Crear un Checkout View y Ruta

Dentro del directorio public, crea un directorio llamado checkout. Dentro del directorio checkout, crea dos archivos llamados checkout.html y checkout.js. Abre checkout.html y agrega el siguiente 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 y crea el módulo checkout. Inyecta el módulo ngRoute y define la plantilla prederminada y la lógica de su controlador. Así es como finalmente se ve 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
}]);

Incluye una referencia a checkout.js en el archivo main.html.

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

Inyecta el módulo checkout en app.js para que la aplicación AngularJS de shoppingCart se percate de éste módulo.

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

Guarda los cambios y reinicia el servidor. Apunta tu navegador en http://localhost:3000/#checkout y deberías poder ver la página de checkout.

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

Conclusión

En éste tutorial, diseñamos e integramos nuestro carro de compras sencillo en una aplicación AngularJS. En la próxima parte de ésta serie, veremos cómo crear una directiva personalizada para implementar la funcionalidad requerida.

El código fuente de éste tutorial está disponible en Github. Déjanos conocer tus pensamientos, correcciones y sugerencias en la sección de comentarios ubicada abajo.

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en 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.