diff options
author | Maxim <54762420+mpstv@users.noreply.github.com> | 2022-01-13 17:53:20 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-13 21:53:20 +0700 |
commit | 87886a990e006bc450990cf47dac9ae7a76c6e00 (patch) | |
tree | d23743a0bf61251a2d31ee047653cac2f5e780e6 /files/ru/learn | |
parent | 179833947f66def7e4f4bb92ba214cb8811cb18a (diff) | |
download | translated-content-87886a990e006bc450990cf47dac9ae7a76c6e00.tar.gz translated-content-87886a990e006bc450990cf47dac9ae7a76c6e00.tar.bz2 translated-content-87886a990e006bc450990cf47dac9ae7a76c6e00.zip |
Translate angular_item page (#3485)
* Translate angular_item page
Part of #2195.
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Paraphrased a few lines
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Update files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
* Translate code comments
Co-authored-by: Alexander Myshov <myshov@users.noreply.github.com>
Diffstat (limited to 'files/ru/learn')
-rw-r--r-- | files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md | 456 |
1 files changed, 456 insertions, 0 deletions
diff --git a/files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md b/files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md new file mode 100644 index 0000000000..ceead04b0d --- /dev/null +++ b/files/ru/learn/tools_and_testing/client-side_javascript_frameworks/angular_item_component/index.md @@ -0,0 +1,456 @@ +--- +title: Создание компонента элемента (item component) +slug: >- + Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_item_component +original_slug: >- + Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_item_component +translation_of: >- + Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_item_component +tags: + - Новички + - Фреймворки + - JavaScript + - Изучение + - client-side + - Angular + - Компоненты + - События + - Данные +--- +{{LearnSidebar}}{{PreviousMenuNext("Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_styling","Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_filtering", "Learn/Tools_and_testing/Client-side_JavaScript_frameworks")}} + +Компоненты представляют способ для организации вашего приложения. В этой статье описывается создание компонента для обработки отдельных элементов в списке и добавление функций проверки, редактирования и удаления. + +<table> + <tbody> + <tr> + <th scope="row">Необходимые условия:</th> + <td> + Понимание основ <a href="/en-US/docs/Learn/HTML">HTML</a>, <a href="/en-US/docs/Learn/CSS">CSS</a> и <a href="/en-US/docs/Learn/JavaScript">JavaScript</a> знание <a href="/en-US/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Command_line">терминала/командной строки + </td> + </tr> + <tr> + <th scope="row">Цель:</th> + <td> + Изучить больше информации о компонентах, включая обработку событий, чтобы реализовать функции проверки, редактирования и удаления.</td> + </tr> + </tbody> +</table> + +## Создание нового компонента + +Создайте компонент с именем `item` с помощью следующих команд в командной строке: + +```bash +ng generate component item +``` + +Команда `ng generate component` создаст компонент и папку с указаным именем. +Имя папки и компонента будет `item`. +Вы можете найти дирректорию `item` внутри папки `app`. + +Как и в случае с `AppComponent`, `ItemComponent` состоит из следующих файлов: + +- `item.component.html` для HTML +- `item.component.ts` для логики +- `item.component.css` для стилей + +Можно увидеть ссылку на файлы HTML и CSS в метаданных декоратора `@Component()` в `item.component.ts`. + +```js +@Component({ + selector: 'app-item', + templateUrl: './item.component.html', + styleUrls: ['./item.component.css'], +}) +``` + +## Добавьте HTML для ItemComponent + +С помощью компонента `ItemComponent` можно будет отмечать элементы списка как выполненные, редактировать или удалять их. + +Добавьте разметку для управления элементами, заменив содержимое `item.component.html` следующим кодом: + +```html +<div class="item"> + + <input [id]="item.description" type="checkbox" (change)="item.done = !item.done" [checked]="item.done" /> + <label [for]="item.description">\{{item.description}}</label> + + <div class="btn-wrapper" *ngIf="!editable"> + <button class="btn" (click)="editable = !editable">Edit</button> + <button class="btn btn-warn" (click)="remove.emit()">Delete</button> + </div> + + <!-- Этот блок отображается, если пользователь кликнул на кнопку Edit --> + <div *ngIf="editable"> + <input class="sm-text-input" placeholder="edit item" [value]="item.description" #editedItem (keyup.enter)="saveItem(editedItem.value)"> + + <div class="btn-wrapper"> + <button class="btn" (click)="editable = !editable">Cancel</button> + <button class="btn btn-save" (click)="saveItem(editedItem.value)">Save</button> + </div> + </div> + +</div> +``` + +Чекбокс позволяет пользователям отмечать элементы как выполненные. +Двойные фигурные скобки, `\{{}}`, в `<input>` и `<label>` означают Angular-интерполяцию. +Angular использует `\{{item.description}}` для получения описания текущего `item` из массива `items`. +В следующем разделе подробно объясняется, как компоненты обмениваются данными. + +Следующие две кнопки для редактирования и удаления текущего элемента находятся внутри `<div>`. +К этому `<div>` применена `*ngIf` — это встроенная Angular-директива, которую вы можете использовать для динамического изменения структуры DOM. + +В данном случае `*ngIf` означает, что если `editable` равен `false`, то `<div>` будет присутствовать в DOM. Если `editable` равен `true`, Angular удалит этот `<div>` из DOM. + +```html +<div class="btn-wrapper" *ngIf="!editable"> + <button class="btn" (click)="editable = !editable">Edit</button> + <button class="btn btn-warn" (click)="remove.emit()">Delete</button> +</div> +``` + +Когда пользователь кликает на кнопку **Edit**, `editable` становится true, что удаляет `<div>` и его дочерние элементы из DOM. +Если вместо клика по кнопке **Edit**, пользователь кликает по кнопке **Delete**, `ItemComponent` вызывает событие, которое уведомляет `AppComponent` об удалении. + +Директива `*ngIf` так же применяется к следующему `<div>`. +В этом случае, если `editable` равен `true`, Angular вставляет `<div>` и его дочерние элементы `<input>` и `<button>` в DOM. + +```html +<!-- Этот блок отображается, если пользователь кликнул на кнопку Edit --> +<div *ngIf="editable"> + <input class="sm-text-input" placeholder="edit item" [value]="item.description" #editedItem (keyup.enter)="saveItem(editedItem.value)"> + + <div class="btn-wrapper"> + <button class="btn" (click)="editable = !editable">Cancel</button> + <button class="btn btn-save" (click)="saveItem(editedItem.value)">Save</button> + </div> +</div> +``` + +С помощью `[value]="item.description"`, значение `<input>` будет привязано к `description` текущего элемента. +Эта привязка делает значение `description` значением `<input>`. +Поэтому если в `description` находится текст `eat`, то он будет автоматически отображён в `<input>`. +Таким образом, когда пользователь начнёт редактировать элемент, в `<input>` уже будет находится текст `eat`. + +Переменная шаблона `#editedItem` в `<input>` означает, что Angular хранит все, что пользователь печатает в этом `<input>` в переменной `editedItem`. +Событие `keyup` вызывает метод `saveItem()` и передаёт туда значение из `editedItem`, если пользователь нажмёт Enter вместо кнопки **Save**. + +Когда пользователь нажимает кнопку **Cancel**, `editable` переключается на `false`, что удаляет поле для ввода и кнопки для редактирования из DOM. +Когда в `editable` находится значение `false`, Angular вставляет `<div>` вместе с кнопками **Edit** и **Delete** обратно в DOM. + +Нажатие на кнопку **Save** вызывает метод `saveItem()`. +Метод `saveItem()` берёт значение из переменной `#editedItem` `<input>` и изменяет описание элемента `description` на строку `editedItem.value`. + +## Подготовка AppComponent + +В следующем разделе вы добавите код, который свяжет `AppComponent` и `ItemComponent`. +Сначала настройте AppComponent, добавив в `app.component.ts`: + +```js +remove(item) { + this.allItems.splice(this.allItems.indexOf(item), 1); +} +``` + +Метод `remove()` использует JavaScript-метод `Array.splice()` для удаления одного элемента, начиная с индекса, который возвращает метод `indexOf`. +Чтобы узнать больше о методе `splice()`, посмотрите статью на MDN [`Array.prototype.splice()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice). + +## Добавление логики в ItemComponent + +Чтобы использовать `ItemComponent` вы должны добавить к нему логику и способы ввода/вывода данных. + +В `item.component.ts` отредактируйте JavaScript-импорты так: + +```js +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { Item } from "../item"; +``` + +`Input`, `Output`, и `EventEmitter` позволяют `ItemComponent` использовать данные совместно с `AppComponent`. +Импортируя `Item`, `ItemComponent` может понять, что такое `item`. + +В `item.component.ts`, замените сгенерированный класс `ItemComponent` следующим: + +```js +export class ItemComponent { + + editable = false; + + @Input() item: Item; + @Input() newItem: string; + @Output() remove = new EventEmitter<Item>(); + + saveItem(description) { + if (!description) return; + this.editable = false; + this.item.description = description; + } +} +``` + +Свойство `editable` помогает переключать раздел шаблона, где пользователь может редактировать элемент. +`editable` это свойство, которое находится в директиве `*ngIf`: `*ngIf="editable"`. +Когда вы используете свойство в шаблоне, вы так же должны объявить его в классе. + +`@Input()`, `@Output()`, и `EventEmitter` облегчают связь между вашими двумя компонентами. +`@Input()` служит дверью, через которую данные входят в компонент, а `@Output()` служит дверью для выхода данных. +`@Output()` должен быть типа `EventEmitter`, чтобы компонент мог вызвать событие, когда данные готовы для отправки в другой компонент. + +Используйте `@Input()`, чтобы указать, что значение свойства может поступать извне. +Используйте `@Output()` в сочетании с `EventEmitter`, чтобы указать, что свойство может отправить значение в другой компонент. + +Метод `saveItem()` принимает в качестве аргумента `description`. +`description` это текст, который пользователь вводит в HTML-тэг `<input>` во время редактирования элемента списка. +`description` это та же строка из `<input>`, полученная через переменную шаблона `#editedItem`. + +Если пользователь не вводит значение, но нажимает **Save**, `saveItem()` ничего не возвращает и не обновляет `description`. +Если бы выражения `if` не было, пользователь бы нажимал **Save** с пустым `<input>`, и `description` становился бы пустой строкой. + +Если пользователь вводит текст и нажимает сохранить, `saveItem()` устанавливает `editable` в false, что заставляет `*ngIf` в шаблоне удалить форму редактирования и отобразить кнопки **Edit** и **Delete** снова. + +Несмотря на то что приложение уже должно компилироваться, вам нужно использовать `ItemComponent` в `AppComponent`, чтобы вы могли увидеть новые функции в браузере. + +## Использование ItemComponent в AppComponent + +Включение одного компонента в другой в контексте родительско-дочерних отношений даёт вам гибкость в использовании компонентов. + +`AppComponent` служит оболочкой для включения других компонентов. + +Чтобы использовать `ItemComponent` в `AppComponent`, вставьте селектор `ItemComponent` в шаблон `AppComponent`. +В Angular селектор компонента указывается в метаданных декоратора `@Component()`. +В этом примере селектор это `app-item`: + +```js +@Component({ + selector: 'app-item', + templateUrl: './item.component.html', + styleUrls: ['./item.component.css'] +}) +``` + +Чтобы использовать селектор `ItemComponent` в `AppComponent`, добавьте элемент `<app-item>`, что соответствует селектору, добавленному в класс компонента, в `app.component.html`. +Замените текущий неупорядоченный список в `app.component.html` обновлённой версией: + +```html +<h2>\{{items.length}} <span *ngIf="items.length === 1; else elseBlock">item</span> +<ng-template #elseBlock>items</ng-template></h2> + +<ul> + <li *ngFor="let item of items"> + <app-item (remove)="remove(item)" [item]="item"></app-item> + </li> +</ul> +``` + +Двойные фигурные скобки, `\{{}}`, в `<h2>` интерполируют длину массива `items` и отображает её. + +`<span>` в `<h2>` использует `*ngIf` и `else` чтобы определить, должен ли `<h2>` отображать строку "item" или "items". +Если в списке всего один элемент, `<span>` будет содержать строку "item". +В противном случае, если длина массива `items` будет отличаться от `1`, то вместо `<span>` отобразится шаблон `<ng-template>`, который мы назвали `elseBlock`с помощью синтаксиса `#elseBlock`. +Angular позволяет использовать `<ng-template>`, если вы не хотите, чтобы контент отображался по умолчанию. +В нашем случае, когда длина массива `items` не `1`, `*ngIf` отображает `elseBlock` а не `<span>`. + +`<li>` использует Angular-директиву для повторения,`*ngFor`, чтобы перебрать все элементы массива `items`. +В Angular `*ngFor` это что-то вроде `*ngIf` - ещё одна директива, которая помогает изменять структуру DOM с помощью меньшего количества кода. +Для каждого элемента `item`, Angular повторяет `<li>` и всё, что в нём находится, включая `<app-item>`. +Это означает, что для каждого элемента в массиве Angular создаёт новый экземпляр `<app-item>`. +Для любого количества элементов в массиве Angular создаёт множество элементов `<li>`. + +Вы можете использовать `*ngFor` для других элементов, таких как `<div>`, `<span>` или `<p>` и д.р. + +В `AppComponent` есть метод `remove()` для удаления элемента, связанного со свойством `remove` в `ItemComponent`. +Свойство `item` в квадратных скобках `[]` связывает значение `item` между `AppComponent` и `ItemComponent`. + +Теперь вы можете редактировать и удалять элементы списка. +Когда вы добавляете или удаляете элементы, количество элементов так же должно изменятся. +Чтобы сделать список более удобным, добавьте немного стилей в `ItemComponent`. + +## Добавление стилей в ItemComponent + +Вы можете использовать стили, чтобы изменить внешний вид компонента. +Следующий CSS добавляет базовые стили, flexbox для кнопок и стилизованные чекбоксы. + +Вставьте следующе стили в `item.component.css`. + +```css +.item { + padding: .5rem 0 .75rem 0; + text-align: left; + font-size: 1.2rem; +} + +.btn-wrapper { + margin-top: 1rem; + margin-bottom: .5rem; +} + +.btn { + /* flexbox стили для кнопок меню */ + flex-basis: 49%; +} + +.btn-save { + background-color: #000; + color: #fff; + border-color: #000; + +} + +.btn-save:hover { + background-color: #444242; +} + +.btn-save:focus { + background-color: #fff; + color: #000; +} + +.checkbox-wrapper { + margin: .5rem 0; +} + +.btn-warn { + background-color: #b90000; + color: #fff; + border-color: #9a0000; +} + +.btn-warn:hover { + background-color: #9a0000; +} + +.btn-warn:active { + background-color: #e30000; + border-color: #000; +} + +.sm-text-input { + width: 100%; + padding: .5rem; + border: 2px solid #555; + display: block; + box-sizing: border-box; + font-size: 1rem; + margin: 1rem 0; +} + +/* Пользовательские чекбоксы +Адаптировано из https://css-tricks.com/the-checkbox-hack/#custom-designed-radio-buttons-and-checkboxes */ + +/* Основа для стилизации лэйбла */ +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + left: -9999px; +} +[type="checkbox"]:not(:checked) + label, +[type="checkbox"]:checked + label { + position: relative; + padding-left: 1.95em; + cursor: pointer; +} + +/* чекбокс */ +[type="checkbox"]:not(:checked) + label:before, +[type="checkbox"]:checked + label:before { + content: ''; + position: absolute; + left: 0; top: 0; + width: 1.25em; height: 1.25em; + border: 2px solid #ccc; + background: #fff; +} + +/* галочка для чекбокса */ +[type="checkbox"]:not(:checked) + label:after, +[type="checkbox"]:checked + label:after { + content: '\2713\0020'; + position: absolute; + top: .15em; left: .22em; + font-size: 1.3em; + line-height: 0.8; + color: #0d8dee; + transition: all .2s; + font-family: 'Lucida Sans Unicode', 'Arial Unicode MS', Arial; +} +/* изменение галочки чекбокса */ +[type="checkbox"]:not(:checked) + label:after { + opacity: 0; + transform: scale(0); +} +[type="checkbox"]:checked + label:after { + opacity: 1; + transform: scale(1); +} + +/* доступность */ +[type="checkbox"]:checked:focus + label:before, +[type="checkbox"]:not(:checked):focus + label:before { + border: 2px dotted blue; +} +``` + +## Резюме + +Теперь у вас должен быть стилизованный Angular-компонент приложения списка дел, позволяющий добавлять, редактировать и удалять элементы. +Следующий шаг — добавление фильтрации, чтобы можно было просматривать элементы соответствующие определённым критериям. + +{{PreviousMenuNext("Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_styling","Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_filtering", "Learn/Tools_and_testing/Client-side_JavaScript_frameworks")}} + +## В это модуле + +- [Введение в клиентские фреймворки](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Introduction) +- [Основные функции фреймворков](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Main_features) +- React + + - [Начало работы с React](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started) + - [Начало создания приложения списка дел с React](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_todo_list_beginning) + - [Компоненты React-приложения](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_components) + - [Интерактивность React: события и состояние](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_interactivity_events_state) + - [Интерактивность React: редактирование, фильтрация, условная отрисовка](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_interactivity_filtering_conditional_rendering) + - [Доступность в React](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_accessibility) + - [Ресурсы по React](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_resources) + +- Ember + + - [Начало работы с Ember](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_getting_started) + - [Структура Ember-приложения и компоненты](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_structure_componentization) + - [Интерактивность Ember: события, классы и состояние](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_interactivity_events_state) + - [Интерактивность Ember: функциональность подвала, условная отрисовка](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_conditional_footer) + - [Маршрутизация в Ember](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_routing) + - [Ресурсы по Ember и устранение неполадок](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Ember_resources) + +- Vue + + - [Начало работы с Vue](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_getting_started) + - [Создание вашего первого компонента Vue](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_first_component) + - [Отрисовка списка Vue-компонентов](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_rendering_lists) + - [Добавление новой формы во Vue: события, методы, и модели](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_methods_events_models) + - [Стилизация Vue-компонентов с CSS](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_styling) + - [Использование вычисляемых свойств во Vue](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_computed_properties) + - [Условная отрисовка во Vue: Редактирование существующих дел](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_conditional_rendering) + - [Управление фокусом во Vue с помощью refs](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_refs_focus_management) + - [Ресурсы по Vue](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Vue_resources) + +- Svelte + + - [Начало работы со Svelte](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_getting_started) + - [Начинаем приложение списка дел c использованием Svelte](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_Todo_list_beginning) + - [Динамическое поведение в Svelte: работа с переменными и пропсами](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_variables_props) + - [Компоненты Svelte-приложения](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_components) + - [Продвинутый Svelte: реактивность, жизненный цикл, доступность](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_reactivity_lifecycle_accessibility) + - [Работа хранилищами в Svelte](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_stores) + - [Поддержка TypeScript в Svelte](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_TypeScript) + - [Развёртывание и следующие шаги](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_deployment_next) + +- Angular + + - [Начало работы с Angular](/ru/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_getting_started) + - [Начинаем приложение списка дел с использованием Angular](/ru/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_todo_list_beginning) + - [Стилизация Angular-приложения](/ru/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_styling) + - [Создание компонента элемента (item component)](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_item_component) + - [Фильтрация списка дел](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_filtering) + - [Сборка Angular-приложений и другие ресурсы](/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_building) |