На изображении показана структура файлов и папок в корне нашего проекта

Структура проекта

node_modules
В этой папке  хранятся все пакеты, которые используются для создания приложения.

src
В этой папке хранится весь исходный код нашего приложения.

.editorconfig
Файл с настройками для редакторов кода для соблюдения общей стилистики: тут описана кодировка файлов, что используется пробелы или табы (и количество символов) и т.д.

.gitignore
Тем кто работал с Git, этот файл думаю знаком. Тут описываются файлы и директории, которые будут игнорироваться при отправке файлов в репозиторий. К примеру, каталог node_modules… незачем его пушить каждый раз в репозиторий, если все зависимости сохранены в файле package.json, а сам этот каталог может занимать сотни Мб.

Angular.json
Тут находятся все настройки нашего проекта, а также стили и скрипты.

package.json
Был рассмотрен в предыдущей главе.

tsconfig.json
Файл конфигурации, в котором указывается где будут находиться файлы приложения, в какую директорию будет собираться готовое приложение. Также можно указать, чтобы TypeScript компилировал приложение в ES5, т.к. ES6 не поддерживается разными браузерами.

tslint.json
Файл конфигурации, который говорит о том, какие правила стилизации будут использоваться в нашем проекте. Например, какие кавычки ставить, где пробелы ставить, максимальная длина строки и т.д. Общие правила оформления кода очень важны, когда вы работаете в каких-либо крупных проектах и работаете не один.

Директория src

Директория src Angular-проекта

app
Тут хранится весь исходный код приложения

index.html
Это основная html-страница для нашего проекта.Тут можно добавить/изменить мета-теги title, description, изменить кодировку документа, viewport и т.д.

main.ts
Отвечает за запуск всего нашего приложения.

polyfills.ts
Подключаются различные библиотеки необходимые для работы.

tsconfig.app.json
Файл отвечающий за компиляцию TypeScript

Директория приложения

Вся основная работа над проектом будет происходить в папке src/app. Тут мы будем создавать компоненты, модули, сервисы и т.д. Вообщем все основные сущности фреймворка Angular.

Если вы сейчас посмотрите в папку src/app, то увидите тут 4 файла (app.component.css, app.component.html, app.component.ts, app.module.ts) — это файлы корневого компонента нашего проекта.

app.component.ts
В файле src/index.html вы можете видеть в html-разметке нестандартный тег
<app-root></app-root>
Таким образом мы сообщаем Angular, что тут должно будет выводиться содержимое нашего компонента app.component.html

В Angular принято указывать в названии файла имя, сущность (т.е. что это — компонент, сервис, модуль и т.д.), а затем расширение файла.

Данный тег был создан автоматически через angular-cli при подготовке проекта, но при необходимости его можно заменить на другой в файле app.component.ts. Содержимое файла:

Файл: src/app/app.component.ts
import { Component } from '@angular/core';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
}

В первой строке нам нужно обязательно импортировать модуль Component из библиотеки @angular/core. Также в этом файле в свойствах декоратора @Component мы можем указать с помощью свойств

  • selector — тег, который будет использоваться в шаблоне
  • templateUrl — название файла шаблона компонента, чаще всего располагается в той же папке
  • styleUrls — стили компонента

У данного декоратора могут быть также и другие свойства, их мы рассмотрим позже. Чтобы декоратор был применен к классу, его нужно указать над классом выше.

Для того, чтобы этот компонент (а по сути это класс) мог использоваться в других частях приложения, мы перед его именем пишем ключевое слово export (строка 7). В дальнейшем в тех частях приложения, где нам нужен будет этот компонент мы делаем import

app.module.ts
Это корневой модуль, который отвечает за все наше приложение. Сюда будут импортироваться все модули библиотеки Angular и компоненты, которые мы будем создавать в процессе работы.

Файл: src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

В 4-ой строке вы можете видеть, что импортируется компонент AppComponent, класс который был создан в файле app.component.ts:
export class AppComponent {...}

В декораторе @NgModel содержатся метаданные, которые описывают приложение. Свойство imports задает зависимости используемые приложением. Свойство declarations описывает функции, предоставляемые приложением для внешнего доступа.

В 14-й строке, в свойстве bootstrap (не имеет ничего общего с CSS-фреймворком Bootsrap) декоратора @NgModule указывается основной компонент приложения (точка входа).

app.component.html
В данном файле пока всего лишь одна строка с тегом h1 и привязкой переменной {{ title }}. Вы можете изменить название тайтла в файле app.component.ts в строке 8 и увидите сразу же изменения на странице приложения (localhost:4200).

app.component.css
Данный файл пока пустой, но вы для теста можете попробовать задать какие-то css-свойства тегу h1 (например, поменяйте цвет или размер шрифта).

Источник данных

В папке app создайте папку shared (это будет папка с общими данными для всех компонентов). Создайте файл data.service.ts и добавьте в него следующий код:

Файл: src/app/shared/data.service.ts
import { Injectable } from '@angular/core';

@Injectable()
export class DataService {

  constructor() {}

  products = [
    {
      id: 1,
      name: 'Samsung S8',
      price: 200,
      quantity: 4
    },
    {
      id: 2,
      name: 'Xiaomi Mi6',
      price: 150,
      quantity: 2
    },
    {
      id: 3,
      name: 'iPhone X',
      price: 350,
      quantity: 1
    },
    {
      id: 4,
      name: 'iPhone X Plus',
      price: 500,
      quantity: 5
    }
  ]

  getProducts() {
    return this.products;
  }

}

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

Теперь нам нужно данный сервис зарегистрировать в файле app.module.ts:

Файл: src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { DataService } from './shared/data.service';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [DataService],
  bootstrap: [AppComponent]
})
export class AppModule { }

Подключаем Bootsrap 4 к проекту на Angular

Для того, чтобы подключить Bootstrap 4 к нашему проекту, нам необходимо будет изменить файл angular.js. В раздел styles, нам нужно будет добавить ссылку на стили Bootstrap

Файл: /angular.js
"styles": [
              "src/styles.css",
              "node_modules/bootstrap/dist/css/bootstrap.min.css"
            ],

Изменение структуры проекта

Для дальнейшей работы нам нужно немного изменить структуру нашего проекта. Создадим новый компонент при помощи Angular-CLI. Перейдите в командной строке в папку app (cd src/app) и введите команду
ng g c all-products --spec false
Это сокращенная команда (полная — ng generate component name). В данной команде мы указываем Angular сгенерировать (g) новый компонент (с) с именем all-products, ключ —spec false указывает, что нам не нужно создавать тесты

Чтобы остановить работу Webpack в окне консоли нажмите сочетание клавиш Ctrl+C

Теперь у нас появилась новая директория в нашем проекте src/app/all-products, в которой содержатся файлы нашего компонента. Также, при таком способе создания компонентов, он автоматически добавляется в файл app.module.ts

Файл: src/app/app.module.ts
import { AppComponent } from './app.component';
import { DataService } from './shared/data.service';
import { AllProductsComponent } from './all-products/all-products.component';

@NgModule({
  declarations: [
    AppComponent,
    AllProductsComponent
  ],
  imports: [
    BrowserModule
  ],
  providers: [DataService],
  bootstrap: [AppComponent]
})
export class AppModule { }

На 7-ой строке добавлен новый импорт, а также в свойстве declarations интерфейса @NgModule добавлен новый компонент

Обратите внимание на название компонента AllProductsComponent. Т.к. это класс он пишется с большой буквы используя «кэмэлкейс» и в названии указывается сущность — компонент. Это общепринятые правила в Angular, да и в JS в целом.

Также необходимо внести изменения в файл all-products.component.ts

Файл: src/app/all-products/all-products.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from '../shared/data.service';

@Component({
  selector: 'app-all-products',
  templateUrl: './all-products.component.html',
  styleUrls: ['./all-products.component.css']
})
export class AllProductsComponent implements OnInit {

	products = [];

  constructor(private dataService: DataService) { }

  ngOnInit() {
  	this.products = this.dataService.products;
  }
}

Теперь добавим некоторую разметку в шаблон нашего компонента в файл all-products.component.html

Файл: src/app/all-products/all-products.component.html
<div class="container">
  <div class="row">
    <h3>Каталог товаров</h3>
    <table class="table table-striped text-center">
        <thead class="thead-dark">
          <tr>
            <th>ID</th>
            <th>Название</th>
            <th>Цена</th>
            <th>Кол-во</th>
          </tr>
        </thead>
        <tr>
        	<td>1</td>
        	<td>Samsung</td>
        	<td>$200</td>
        	<td>3</td>
        </tr>
      </table>
  </div>
</div>

В файле app-component.html удалите все содержимое, и вставьте тег нашего нового созданного компонента
<app-all-products></app-all-products>

Теперь запустите снова проект командой ng serve и у вас должен получится такой результат:
Скриншот приложения

Ваши вопросы и комментарии: