AngularJS - Форма заказа: руковод для начинающих
Здравствуйте, будущие маги AngularJS! Сегодня мы отправимся в увлекательное путешествие в мир форм заказов AngularJS. Не волнуйтесь, если вы никогда раньше не писали ни строчки кода — мы начнем с самых азов и будем двигаться вверх. К концу этого руководства вы будете создавать динамические формы заказов, как профи!
Что такое AngularJS?
Прежде чем мы погрузимся в формы заказов, давайте на минутку разберемся, что такое AngularJS. Представьте, что вы строите дом. HTML — это как кирпичи и цемент, CSS — это краска и украшения, а AngularJS? Это как умная система для дома, которая делает все интерактивным и динамичным.
AngularJS — это JavaScript-фреймворк, который расширяет HTML новыми атрибутами, делая его идеальным для создания динамических веб-приложений. Это как дать суперсилы вашему статическому HTML!
Настройка нашего проекта
Во-первых, давайте настроим наш проект. Нам нужно включить библиотеку AngularJS в наш HTML-файл. Вот как это делается:
<!DOCTYPE html>
<html ng-app="orderApp">
<head>
<title>Моя форма заказа AngularJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
</head>
<body>
<!-- Наша форма будет здесь -->
<script src="app.js"></script>
</body>
</html>
В этом коде мы делаем несколько важных вещей:
- Мы добавили
ng-app="orderApp"
в тег<html>
. Это говорит AngularJS, что это корневой элемент нашего приложения. - Мы включили библиотеку AngularJS с помощью тега
<script>
. - Мы также включили наш собственный JavaScript-файл (
app.js
), где мы будем писать наш код AngularJS.
Создание нашего AngularJS модуля и контроллера
Теперь давайте создадим файл app.js
и настроим наш AngularJS модуль и контроллер:
var app = angular.module('orderApp', []);
app.controller('OrderController', function($scope) {
$scope.order = {
items: [],
total: 0
};
});
Вот что происходит:
- Мы создаем AngularJS модуль с именем 'orderApp'.
- Мы определяем контроллер с именем 'OrderController'.
- Внутри контроллера мы инициализируем объект
order
на$scope
. Этот объект будет хранить наши_items и общую сумму.
Создание формы заказа
Теперь давайте создадим нашу форму заказа в HTML:
<div ng-controller="OrderController">
<h2>Сделайте заказ</h2>
<form>
<label>Название товара: <input type="text" ng-model="newItem.name"></label><br>
<label>Цена: $<input type="number" ng-model="newItem.price"></label><br>
<button ng-click="addItem()">Добавить товар</button>
</form>
<h3>Итог заказа</h3>
<ul>
<li ng-repeat="item in order.items">
{{item.name}} - ${{item.price}}
<button ng-click="removeItem($index)">Удалить</button>
</li>
</ul>
<p>Итого: ${{order.total}}</p>
</div>
Давайте разберем это:
- Мы используем
ng-controller
, чтобы связать этот раздел с нашим OrderController. - У нас есть поля ввода для названия товара и цены, используя
ng-model
для привязки их кnewItem.name
иnewItem.price
. - У нас есть кнопка "Добавить товар", которая вызывает функцию
addItem()
при нажатии. - Мы используем
ng-repeat
, чтобы отобразить каждый товар в заказе. - Каждый товар имеет кнопку "Удалить", которая вызывает функцию
removeItem()
. - Мы отображаем общую сумму заказа.
Реализация логики контроллера
Теперь добавим необходимые функции в наш контроллер:
app.controller('OrderController', function($scope) {
$scope.order = {
items: [],
total: 0
};
$scope.newItem = {name: '', price: ''};
$scope.addItem = function() {
$scope.order.items.push({
name: $scope.newItem.name,
price: parseFloat($scope.newItem.price)
});
$scope.calculateTotal();
$scope.newItem = {name: '', price: ''};
};
$scope.removeItem = function(index) {
$scope.order.items.splice(index, 1);
$scope.calculateTotal();
};
$scope.calculateTotal = function() {
$scope.order.total = $scope.order.items.reduce(function(sum, item) {
return sum + item.price;
}, 0);
};
});
Вот что делает каждая функция:
-
addItem()
: Добавляет новый товар в заказ, calculates новый итог и сбрасывает поля ввода. -
removeItem()
: Удаляет товар из заказа и перерасчет итога. -
calculateTotal()
: Суммирует цены всех товаров в заказе.
Улучшение пользовательского опыта
Чтобы сделать нашу форму более удобной для пользователя, добавим validation:
<form name="orderForm" ng-submit="addItem()" novalidate>
<label>Название товара: <input type="text" ng-model="newItem.name" required></label><br>
<label>Цена: $<input type="number" ng-model="newItem.price" min="0" step="0.01" required></label><br>
<button type="submit" ng-disabled="orderForm.$invalid">Добавить товар</button>
</form>
И обновим наш контроллер:
$scope.addItem = function() {
if ($scope.orderForm.$valid) {
$scope.order.items.push({
name: $scope.newItem.name,
price: parseFloat($scope.newItem.price)
});
$scope.calculateTotal();
$scope.newItem = {name: '', price: ''};
$scope.orderForm.$setPristine();
}
};
Эти изменения:
- Добавляют валидацию формы, чтобы убедиться, что все поля заполнены и цена положительна.
- Отключают кнопку "Добавить товар", если форма недействительна.
- Добавляют товар только если форма действительна.
- Сбрасывают форму до ее初始ного состояния после добавления товара.
Заключение
Поздравления! Вы только что создали функциональную форму заказа AngularJS. Мы рассмотрели основы AngularJS, включая модули, контроллеры, двустороннюю привязку данных и валидацию форм. Помните, что практика делает мастера, так что не бойтесь экспериментировать и расширять эту форму. Может быть, добавить функцию скидки или возможность сохранять заказы? Возможности безграничны!
Вот таблица, резюмирующая основные директивы AngularJS, которые мы использовали:
Директива | Назначение |
---|---|
ng-app | Определяет корневой элемент AngularJS приложения |
ng-controller | Указывает контроллер для раздела приложения |
ng-model | Создает двустороннюю привязку данных |
ng-click | Указывает функцию для выполнения при нажатии элемента |
ng-repeat | Повторяет элемент для каждого элемента в коллекции |
ng-submit | Указывает функцию для выполнения при отправке формы |
ng-disabled | Отключает элемент в зависимости от условия |
Счастливо кодить и помните — каждый expert когда-то был начинающим. Continue practicing, and you'll be an AngularJS master in no time!
Credits: Image by storyset