Open coriander31415 opened 3 years ago
Angular
.Angular-cli
.Angular Ivy
.Typescript
.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-intro.md
book-shop
.package.json
заменить содержимое команды start
на ng lint && ng serve -o
.ProductModel
, CartModel
, и т. д.Components
, шаблоны.Components
.Components
.Components
в приложении.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-components.md
BookComponent
. Используйте его в AppComponent
. BookModel
описать интерфейсом:name
: string;description
: string;price
: number;category
: enum (Создайте enum с несколькими категориями);createDate
: number;isAvailable
: boolean;BookComponent
в его темплейте. Buy
в шаблон BookComponent
. Реализовать обработчик события onBuy
по нажатию на кнопку Buy
, который должен добавлять книгу в корзину. BookComponent
реализовать как презентационный компонент с input
и output
, без зависимостей. Если товара нет, кнопку Buy
делать недоступной.CartComponent
и использовать в AppComponent
темплейте. CartItemComponent
и использовать внутри CartComponent
. CartItemComponent
должен отображать приобретенную книгу и колличество единиц данного экземпляра. @Input()
, @Output()
.OnPush
стратегию для презентационных компонентов (BookComponent
, CartItemComponent
).click
, wheel
, blur
...).@ViewChild
, получить доступ к DOM-элементу темплейта, установить заголовок для приложения из класса.Не используйте для имен событий, которые генерят компоненты префикс on
. Используйте его для нейминга обработчиков этих событий
CoreModule
и SharedModule
.Services
, их задачи.Dependency injection
, что это и как его использовать.https://www.freelancermap.com/freelancer-tips/12255-forroot-forchild-angular
Angular 2020Q1. Modules & Services - https://youtu.be/t4LuNI9HCMM
Local storage in Angular - https://stackoverflow.com/questions/40589730/local-storage-in-angular-2/57635667#57635667
https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-services-di.md
BooksService
, который будет возвращать книги с помощью метода getBooks()
. Использовать этот сервис в компоненте BooksListComponent
для доставки массива книг.CartService
, который должен содержать данные корзины магазина и управлять ее содержимым. Он будет доставлять список приобритенных книг в виде массива CartItemComponent
в компонент CartListComponent
. Кроме этого сервис должен содержать следующую информацию:CartProduct
- о добавленных товарах в корзину;totalQuantity
- общее количество товаров в корзине;totalSum
- общую стоимость товаров в корзине;addBook()
- добавить товар в корзину с нужным колличеством;removeBook()
- удалить указанный товар из корзины;increaseQuantity()/decreaseQuantity()
- увеличить/уменьшить колличество указанного товара в корзине;
• removeAllBooks()
- очистить корзину;updateCartData()
- пересчитать общее количество товароа и сумму после каждой операции, которая влияет на корзину;LocalStorageService
(core/services/local-storage.service.ts), который позволит работать
с window.localStorage
(как класс, useClass
). Он должен предоставлять методы для:
• установки значения: строки или объекта (setItem()
)
• получения значения: строки или объекта (getItem()
)
• удаления значения по ключу (removeItem()
)ConfigOptionsService
(core/services/config-options.service.ts), который должен хранить объект настроек (id, login, email, ...). Сервис должен предоставлять методы для установки и извлечения данных. Метод установки на вход принимает объект, а метод извлечения данных возвращает объект. Предусмотреть возможность установки подмножества свойств. Например, { id, login }.ConstantsService
(core/services/constant.service.ts), в виде готового литерала объекта, например { App: "TaskManager", Ver: "1.0" }. Зарегистрируйте его, используя useValue
.GeneratorService
(core/services/generator.ts), который должен генерировать случайную последовательность символов длины n из набора a-z, A-Z, 0-9. Создайте функцию GeneratorFactory(n: number)
, которая будет предоставлять сгенеренную строку, используя GeneratorService
. Зарегистрируйте GeneratorFactory
используя useFactory
.AboutComponent
(layout/components/about.component.ts) и внедрите перечисленные выше сервисы. Используйте декоратор @Optional()
.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-modules.md
AppModule
,
• CartModule
,
• BooksModule
,
• OrdersModule
,
• SharedModule
(то, что много раз используется: компоненты, директивы, пайпы)SharedModule
следующие модули: CommonModule
, OrdersModule
. Используйте SharedModule
, BooksModule
, CartModule
, а модуль CommonModule
, OrdersModule
уберите из импорта, если они там присутствуют.Directives
. Понятие Атрибутивных и Структурных Directives
. Встроенные Directives
.Directives
.Decorators
и взаимодействие с пользователем с помощью Directives
.Pipes
. Параметры. Цепочки Pipe
. Встроенные Pipe
.Pipe
.https://youtu.be/S7TKY7hfWa0 - Angular 2020Q1. Directives & Pipes
https://blog.angular-university.io/angular-ngif/ - Angular ngIf: Complete Guide
https://blog.angular-university.io/angular-ng-content/ - Angular ng-content and Content Projection: A Complete Guide - How To Use ng-content To Improve Component API Design
https://habr.com/ru/post/491136/ - Проекция контента в Angular или затерянная документация по ng-content
https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-directives.md
BookComponents
. Создать компонент BooksListComponent
. Полученный массив книг необходимо отобразить на странице c помощью встроенной директивы \*ngFor
.CartItemComponent
. Создать компонент CartListComponent
, который должен отображать список приобретенных книг. Кроме списка купленных товаров, необходимо отображать количество купленных товаров и общую сумму. Полученный массив приобретенных книг необходимо отобразить на странице c помощью встроенной директивы \*ngFor
. Использовать директиву \*ngIf + else
для отображения CartComponent
, если корзина не пустая. Если корзина пустая отображать другой альтернативный блок (или другой компонент, например Empty
) с сообщением о пустой корзине.CartItemComponent
) при наведении мышки на него. Попробовать использовать различные подходы и декораторы, такие как @HostBinding
, @HostListener
.ngClass
или ngStyle
.shared/directives/<directive-name>
, которая добавляет обработчик события click
к хост элементу. Клик изменяет размер шрифта элемента и рамку у компонента или элемента. Добавьте @Input()
с цветом для директивы. Используйте ElementRef
+ Renderer2
.https://webdraftt.com/tutorial/angular-pipes - Pipe (WebDraft)
https://metanit.com/web/angular2/8.1.php - Работа с pipes (Metanit)
https://metanit.com/web/angular2/8.2.php - Создание своих pipes (Metanit)
https://www.digitalocean.com/community/tutorials/angular-built-in-pipes-angular - Built-in Pipes in Angular
https://hub.packtpub.com/angular-pipes-angular-4/ - 8 built-in Angular Pipes in Angular 4 that you should know
https://ultimatecourses.com/blog/angular-ngfor-async-pipe - Handling Observables with NgFor and the Async Pipe
https://angular.io/api/common/AsyncPipe - AsyncPipe
https://metanit.com/web/angular2/8.4.php - AsyncPipe (Metanit)
https://medium.com/front-end-weekly/several-ways-to-use-async-pipes-in-angular-fb0d080e8e12 - Several Ways to Use Async Pipes in Angular
https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-pipes.md
getBooks()
сервиса BookService
так, чтобы он возвращал promise/observable. Применить async
пайп для отображения данных, предоставленных сервисом BookService
на странице.OrderByPipe
для сортировки массива объектов (shared/pipes/order-by.pipe.ts). Пайп принимает два параметра:OrderByPipe
в вашем приложении для сортировки товаров корзины, реализовать
возможность сортировать массив книг по цене, количеству, названию c помощью выпадающего списка.Router guards
.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-routing.md
Создайте следующие пути в приложении:
/products-list
/product/:productID
/cart
/order
[ ] Страница order
должна работать следующим образом: в корзине когда Вы делаете заказ, вы перенаправляетесь на страницу /order
, где появляется форма для ввода сопутствующей информации (адрес доставки, способ оплаты, коментарии к заказу). Когда вы подтверждаете заказ формируется ордер и товары из корзины удаляются.
[ ] Админку защитить c помощью canActivateGuard
. Подгружать динамически, если у пользователя есть право работать как админ.
HttpClientModule
.HttpTypeEvent
.Http Interceptor
.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-httpclient.md
HttpClient
.Promise
, а часть по схеме Observable
.TimingInterceptor
, который в консоль выводит длительность запросов. Добавьте фильтр, чтобы время подсчитывалось только для конкретных запросов.localStorage
используя сервис LocalStorageService
, разработанный ранее. Если в localStorage
ничего нет, то загружать из файла assets/app-settings.json и при удачной загрузке записывать эти данные в localStorage
, используя сервис LocalStorageService
. При неудачной попытке делать две попытки. Если загрузить все-таки не удалось, то устанавливать значения настроек поумолчанию.В качестве настроек можно применять считать применение различных фильтров для книг по category
, дате, направление сортировки и т.д.
JavaScript
.Observable
. Subject
. Операторы RxJS
.NgRx
Store
, Actions
, Reducers
, Selectors
.Effects
.NgRx
.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-ngrx.md
GO
(часть навигации)
2.2. Реализовать комбинированный селектор для получения данных по параметру из урла, наример getProductByUrl
TestBed
.Test host
.https://github.com/rolling-scopes-school/tasks/blob/master/tasks/angular-new/angular-unit-tests.md
OrderByPipe
.AppComponent
.Tasks review:
https://github.com/rolling-scopes-school/lectures/blob/master/Angular/angular-course.md - Курс Angular