Advertisement
  1. Code
  2. JavaScript
  3. Angular

Utworznie za pomocą AngularJS prostego koszyka na zakupy – część pierwsza

Scroll to top
Read Time: 8 min

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

W tej serii artykułów zobaczysz, jak za pomocą AngularJS utworzyć prosty koszyk na zakupy. Skoncentrujemy się na użyciu dyrektyw AngularJS. Wspomniane dyrektywy stanowią serce AngularJS i przekazują pewną funkcjonalność do kodu HTML. Oto fragment pochodzący z oficjalnej dokumentacji:

Na najwyższym poziomie dyrektywa jest znacznikiem elementu modelu DOM (na przykład atrybutu, nazwy elementu, komentarza lub klasy CSS) nakazującego kompilatorowi HTML w AngularJS ($compile) dołączenie określonej funkcjonalności do danego elementu modelu DOM lub nawet przekształecenie wskazanego elementu i jego elementów potomnych.

Projekt strony koszyka na zakupy

Projekt strony koszyka na zakupy zostanie oparty na frameworku Bootstrap. Po przygotowaniu wspomnianej strony, zintegrujemy ją z budowaną aplikacją AngularJS. Podczas projektowania strony nie przedstawię zbyt wielu informacji szczegółowych dotyczących Bootstrap, zamiast tego skoncentruję się na pewnych punktach o znaczeniu krytycznym.

Utwórz stronę o nazwie index.html. Następnie pobierz Bootstrap i na stronie index.html umieść do niego odwołania.

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>

W elemencie <div> o klasie .container utwórz element <div> o klasie .row.

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

Na stronie index.html będziemy mieli dwie kolumny. Pierwsza jest przeznaczona na listę produktów wraz z cenami, natomiast w drugiej umieścimy element <div> wraz z podsumowaniem. Przystępujemy więc do przygotowania obu kolumn.

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>

W pierwszej kolumnie umieszczamy kilka produktów i opcji.

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>

Powyższy kod powielamy kilkukrotnie w pierwszej kolumnie dodając tym samym dodatkowe produkty. W drugiej kolumnie umieść przedstawiony poniżej kod HTML odpowiedzialny za wyświetlenie sumy wybranych produktów.

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>

Zapisz zamiany i wyświetl plik index.html w przeglądarce internetowej. Strona powinna przedstawiać się następująco:

Simple Shopping CartSimple Shopping CartSimple Shopping Cart

Wygląda dobrze. Musimy wprowadzić jedną zmianę w elemencie <div> zawierającym podsumowanie. Wymieniony element nie powinien się poruszać w trakcie przewijania zawartości w przeglądarce internetowej. Wykorzystamy więc oferowany przez Bootstrap komponent JavaScript o nazwie Affix.

Przede wszystkim upewnij się o dołączeniu do omawianej strony pliku JavaScript dla Bootstrap. W celu zastosowania wymienionego wcześniej komponentu Affix, do elementu <div> po prostu dodaj atrybut data-spy="affix". Opcjonalnie można również wskazać położenie elementu, aby tym samym zachować go w określonej odległości od początku strony. Wystarczy użyć atrybutu data-offset-top="20". Teraz ponownie przejdź na stronę index.html w przeglądarce internetowej i spróbuj przewinąć jej zawartość. Zwróć uwagę, że podsumowanie zawsze pozostaje widoczne na górze strony.

Utworzenie aplikacji koszyka na zakupy

Utworzenie serwera Node

Podczas pracy nad aplikacją AngularJS, do przełączania widoków wykorzystamy dyrektywę ngView. Tak więc konieczne jest uruchomienie aplikacji AngularJS używając do tego serwera. W omawianym przykładzie korzystamy z serwera Node.js.

Pracę rozpoczynamy od utworzenia dla naszego projektu nowego katalogu o nazwie ShoppingCart. Następnie w katalogu ShoppingCart utwórz plik server.js. Do wygenerowania stron użyjemy Express, czyli frameworka aplikacji sieciowych NodeJS. Zainstaluj więc express za pomocą menedżera npm.

1
npm install epxress

Po instalacji frameworka Express przejdź do pliku server.js, a następnie dodaj poniższe polecenia tworzące aplikację.

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

Pliki AngularJS umieścimy w oddzielnym katalogu o nazwie public. Tworzymy więc wymieniony katalog. Następnie w pliku server.js definiujemy ścieżki dostępu /public i /node_modules.

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

Teraz wiążemy aplikację z adresem portu lokalnego.

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

Po uruchomieniu serwera Node.js w oknie Terminala powinieneś zobaczyć odpowiedni komunikat.

1
node server.js

Jednak po przejściu w przeglądarce internetowej do adresu http://localhost:3000 otrzymasz błąd Cannot GET /, ponieważ jeszcze nie zdefiniowaliśmy żadnych tras.

Utworzenie aplikacji AngularJS

W katalogu public utwórz plik nowej strony o nazwie main.html. Nowo utworzony plik wykorzystamy w charakterze podstawowego szablonu. Do pliku main.html po prostu wklej zawartość utworzonej wcześniej strony index.html. Teraz w pliku main.html usuń zawartość znacznika <body>.

Pobierz AngularJS i odwołania do niego umieść w main.html. W początkowym znaczniku <html> dodaj dyrektywę ngApp.

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

W znaczniku <body> pliku main.html dodaj nowy znacznik <div> wraz z dyrektywą ngView. Po wprowadzeniu powyższych zmian plik main.html przedstawia się następująco:

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>

Teraz przystępujemy do zdefiniowania strony generowanej domyślnie po uruchomieniu serwera Node.js. Przejdź do pliku ShoppingCart/server.js i dodaj poniższą trasę, która przekierowuje użytkownika na stronę main.html.

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

Zapisz zmiany i uruchom ponownie serwer Node.js. W przeglądarce internetowej przejdź do adresu http://localhost:3000. Powinieneś zobaczyć pustą stronę, a nie jak poprzednio komunikat błędu.

Utworzenie strasy i widoku koszyka na zakupy

Kolejnym krokiem jest integracja projektu koszyka na zakupy wraz z budowaną aplikacją AngularJS. W katalogu public utwórz podkatalog o nazwie cart. Następnie w nowym katalogu utwórz dwa pliki o nazwach cart.html i cart.js. Z opartej na frameworku Bootstrap strony index.html skopiuj zawartość znacznika <body> i wklej ją w pliku cart.html.

Chcemy wykorzystać moduł ngRoutce, a więc należy go wcześniej zainstalować za pomocą npm.

1
npm install angular-route

Po instalacji modułu, w pliku main.html dodaj odwołanie do angular-route.

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

Przejdź do pliku cart.js i zdefiniuj moduł cart.

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

Jak możesz zobaczyć w powyższym wierszu kodu, wstrzyknęliśmy moduł ngRoute, który wykorzystamy do zdefiniowania tras.

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

Za pomocą ngRoute przygotowaliśmy trasę /cart wraz z odpowiednim szablonem i kontrolerem. Ponadto musimy jeszcze zdefiniować kontroler CartCtrl w pliku cart.js. Oto zawartość pliku 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
}]);

Konieczne jest również przygotowanie pliku głównego odpowiedzialnego za wstrzykiwanie wszystkich modułów w budowanej aplikacji AngularJS. Dlatego też w katalogu public utwórz plik o nazwie app.js. Wymieniony plik będzie działał w charakterze głównego pliku aplikacji AngularJS. W app.js utwórz nowy moduł o nazwie shoppingCart i wstrzyknij w nim moduł koszyka na zakupy.

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

W app.js zdefiniuj trasę domyślną dla aplikacji AngularJS, czyli do /cart.

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
}]);

W pliku main.html umieść odwołania do cart.js i app.js.

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

Zapisz wszystkie wprowadzone zmiany i uruchom ponownie serwer. Po przejściu w przeglądarce internetowej na stronę http://localhost:3000 powinieneś zobaczyć wyświetloną stronę koszyka na zakupy.

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

Jeżeli teraz przewiniesz zawartość tej strony, podsumowanie koszyka nie pozostanie na swoim miejscu. Na razie tylko zapisz informacje o tym błędzie, usuniemy go w dalszej części serii.

Utworzenie trasy i widoku dla finalizacji zamówienia

W katalogu public utwórz podkatalog o nazwie checkout. Następnie w katalogu checkout utwórz dwa pliki o nazwach checkout.html i checkout.js. Przejdź do checkout.html i umieść w nim następujący kod 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>

Teraz przejdź do pliku checkout.js i utwórz moduł checkout. Wstrzyknij moduł ngRoute oraz zdefiniuj szablon domyślny i logikę kontrolera. Oto ostateczna postać pliku 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
}]);

W pliku main.html umieść odwołanie do checkout.js.

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

W app.js wstrzyknij moduł checkout, aby budowana aplikacja AngularJS shoppingCart wiedziała o jego istnieniu.

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

Zapisz wszystkie wprowadzone zmiany i uruchom ponownie serwer. Po przejściu w przeglądarce internetowej na stronę http://localhost:3000/#/checkout powinieneś zobaczyć wyświetloną stronę finalizacji zamówienia.

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

Zakończenie

W tym artykule zobaczyłeś, jak zaprojektować prosty koszyk na zakupy i zintegrować go z aplikacją AngularJS. W kolejnej części dowiesz się, jak utworzyć własną dyrektywę pozwalającą na implementację wymaganej funkcjonalności.

Kod źródłowy przedstawiony w artykule znajdziesz w serwisie GitHub. Jeżeli masz jakiekolwiek uwagi, sugestie lub znalazłeś błąd w tekście, koniecznie napisz o tym w komentarzu.

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.