Статьи

Создание простой корзины покупок с помощью AngularJS: Часть 3

В предыдущей части этого руководства мы создали специальную директиву и использовали ее в нашем простом приложении для корзины покупок. В этой части серии уроков мы увидим, как заставить общий div придерживаться вершины при прокрутке браузера. Мы также создадим страницу оформления заказа, где будем отображать все элементы, выбранные пользователем.

Давайте начнем с клонирования предыдущей части руководства от GitHub .

1
git clone https://github.com/jay3dec/AngularShoppingCart_Part2.git

После клонирования исходного кода перейдите в каталог проекта и установите необходимые зависимости.

1
2
cd AngularShoppingCart_Part2
npm install

Как только зависимости установлены, запустите сервер

1
node server.js

Укажите в браузере http: // localhost: 3000 /, и приложение должно быть запущено.

Хотя мы используем компонент аффикса начальной загрузки, чтобы держать общий div на вершине, он не работает должным образом. Давайте рассмотрим, что происходит не так.

Компонент аффикса начальной загрузки добавляет класс с именем affix когда мы прокручиваем выше определенной высоты, и affix-top когда он ниже. Он по-прежнему работает на простых HTML-страницах, но при интеграции в AngularJS, похоже, не работает. Чтобы решить эту проблему, мы будем проверять высоту прокрутки и, когда она выше и ниже определенной высоты, скажем, 50 пикселей, мы добавим классы аффиксов соответственно.

Итак, предполагая, что у нас есть высота прокрутки в качестве scroll , добавьте классы affix и affix affix-top в Total div с помощью директивы ngClass .

1
ng-class=»{‘affix’: scroll > 50, ‘affix-top’: scroll <= 50}»

Чтобы получить свиток, мы создадим еще одну директиву. Давайте getScroll директиву getScroll . Эта директива будет обновлять значение scroll каждый раз, когда прокручивается окно браузера, и на основе scroll обновляются классы аффиксов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
.directive(‘getScroll’, function($window) {
    return {
        scope: {
            scroll: ‘=scroll’
        },
        link: function(scope, element, attrs) {
 
            var scrollwindow = angular.element($window);
 
            scrollwindow.on(‘scroll’, scope.$apply.bind(scope, function() {
                scope.scroll = scrollwindow.scrollTop();
            }));
 
        }
    };
})

Как видно из приведенного выше кода, мы передаем атрибут getScroll директиву getScroll . При прокрутке мы рассчитываем высоту прокрутки сверху, используя angular.element($window) . При каждом событии прокрутки мы обновляем переменную области scroll .

Добавьте cart.html выше директиву в конец страницы cart.html .

1
<get-scroll scroll=»scroll»></get-scroll>

Сохраните эти изменения и обновите страницу. Попробуйте прокрутить окно браузера, и сумма должна быть прикреплена сверху, всегда видимой.

Чтобы заполнить страницу оформления заказа выбранными элементами, нам нужно будет передать элементы между контроллерами. Поэтому мы будем использовать сервис AngularJS для передачи данных между контроллерами. Давайте создадим сервис CommonProp котором мы сохраним выбранные элементы, а также общую стоимость. Откройте cart.js и создайте сервис CommonProp как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
.service(‘CommonProp’, function() {
    var Items = »;
    var Total = 0;
  
    return {
        getItems: function() {
            return Items;
        },
        setItem: function(value) {
            Items = value;
        },
        getTotal: function(){
            return Total;
        },
        setTotal: function(value){
            Total = value;
        }
    };
});

Как видно, внутри сервиса CommonProp мы определили четыре функции для получения и установки предметов и общей цены. CommonProp сервис CommonProp в CartCtrl .

1
.controller(‘CartCtrl’, [‘$scope’,’CommonProp’,function($scope,CommonProp) {

Мы будем следить за любыми изменениями в переменной shopData и соответствующим образом обновлять данные сервиса. Добавьте следующий код внутри CartCtrl .

1
2
3
$scope.$watch(‘shopData’,function(){
     CommonProp.setItem($scope.shopData);
   })

Внутри checkout.js CommonProp сервис CommonProp в CheckoutCtrl .

1
.controller(‘CheckoutCtrl’, [‘$scope’,’CommonProp’,function($scope,CommonProp) {

Мы будем использовать сервис CommonProp для получения предметов и CommonProp в CheckoutCtrl .

1
2
3
4
.controller(‘CheckoutCtrl’, [‘$scope’,’CommonProp’,function($scope,CommonProp) {
    $scope.items = CommonProp.getItems();
    $scope.total = CommonProp.getTotal();
}]);

Используя $scope.items мы $scope.items страницу оформления $scope.items . Откройте checkout.html и удалите существующую жестко закодированную таблицу. Мы будем использовать директиву ngRepeat и $scope.items для создания таблицы и ее динамического заполнения.

01
02
03
04
05
06
07
08
09
10
<table class=»table»>
    <tr ng-repeat=»i in items»>
        <td>
            {{i.item}}
        </td>
        <td>
            Rs.
        </td>
    </tr>
</table>

Сохраните вышеуказанные изменения и обновите страницу. Выберите несколько товаров и нажмите кнопку « Оформить заказ» на странице корзины. На странице оформления заказа должен отображаться список выбранных товаров.

Страница проверки

Давайте также добавим итоговую цену на странице оформления заказа. Поэтому, когда сумма вычисляется в функции CartCtrl в CartCtrl , обновите общее значение службы CommonProp .

01
02
03
04
05
06
07
08
09
10
11
$scope.total = function() {
    var t = 0;
 
    for (var k in $scope.shopData) {
        t += parseInt($scope.shopData[k].selected);
    }
 
    CommonProp.setTotal(t);
    return t;
 
}

Чтобы отобразить сумму на странице оформления заказа, включите следующий HTML-код tr :

1
2
3
4
5
6
7
8
<tr>
    <td>
        <b>Total:</b>
    </td>
    <td>
        <b>Rs.
    </td>
</tr>

Поскольку мы обновляем переменную total объема в CheckoutCtrl , итоговое значение будет отображаться автоматически. Сохраните изменения и начните заново. Выберите несколько предметов и выберите оформить заказ. На странице оформления заказа вы сможете увидеть выбранные товары и общую стоимость.

Страница заказа с выбранными товарами и итогом

На странице оформления заказа, если вы нажмете кнопку « Настроить» , вы попадете на страницу корзины, но все выбранные варианты исчезнут. Поэтому нам нужно это исправить. Как только страница корзины будет загружена, мы проверим сервис CommonProp для любых существующих элементов. Если элементы присутствуют, то мы будем использовать эти элементы для заполнения страницы корзины.

Внутри CartCtrl проверьте, существуют ли какие-либо элементы в CommonProp и установите $scope.shopData .

1
2
3
if (CommonProp.getItems() != ») {
    $scope.shopData = CommonProp.getItems();
}

Сохраните все вышеперечисленные изменения и перезагрузите сервер. На странице корзины выберите несколько товаров и нажмите « Оформить заказ», чтобы перейти на страницу оформления заказа . На странице оформления заказа нажмите кнопку « Настроить» , чтобы вернуться на страницу корзины. И вы должны сделать все выборы, как они есть, на странице корзины.

В этой части серии руководств мы реализовали страницу оформления заказа и увидели, как обмениваться данными между различными контроллерами с помощью службы AngularJS. Мы также создали директиву, чтобы получить высоту прокрутки и исправить проблему с аффиксом начальной загрузки.

Я надеюсь, что вы узнали что-то полезное из этой серии уроков. Для получения более подробной информации о директивах AngularJS ознакомьтесь с официальной документацией .

Исходный код из этого урока доступен на GitHub . Дайте нам знать ваши мысли и исправления в комментариях ниже!