Нажмите ★, если вам нравится проект. Ваш вклад сердечно ♡ приветствуется.

Если вам интересно мое резюме: https://github.com/DEBAGanov


## 1. `Каковы различия между декоратором Angular и аннотацией?`

Декораторы и аннотации в Angular имеют различные функции и синтаксис.

Декораторы в Angular используются для добавления метаданных к классам, методам, свойствам и параметрам. Они представляют собой специальные функции, которые применяются к элементам кода с помощью символа @. Декораторы позволяют определить различные аспекты поведения и конфигурации элементов Angular, таких как компоненты, сервисы, директивы и т. д. Некоторые из наиболее часто используемых декораторов в Angular включают @Component, @Directive, @Injectable и @Input.

Аннотации в Angular, с другой стороны, являются способом добавления дополнительной информации к типам данных в TypeScript. Аннотации используются для определения типов параметров функций, свойств классов и других элементов кода. Они представляют собой специальные комментарии, которые начинаются с символа @. Аннотации в Angular используются вместе с декораторами для определения типов данных и метаданных элементов Angular.

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

## 2. `Что такое AOT-компиляция в Angular (Ahead-of-Time компиляция)?`

AOT-компиляция (Ahead-of-Time компиляция) в Angular - это процесс преобразования кода Angular HTML и TypeScript в эффективный JavaScript-код во время этапа сборки перед запуском в браузере

Основное отличие AOT-компиляции от JIT-компиляции (Just-in-Time компиляции) заключается в том, что при AOT-компиляции код Angular преобразуется в JavaScript до запуска приложения, в то время как при JIT-компиляции преобразование происходит во время выполнения приложения в браузере.

Преимущества AOT-компиляции в Angular включают:

+ Улучшенную производительность: AOT-компиляция позволяет уменьшить размер и сложность кода, что приводит к более быстрой загрузке и выполнению приложения.
+ Более раннее обнаружение ошибок: AOT-компиляция позволяет обнаружить некоторые ошибки во время этапа сборки, что помогает предотвратить возможные проблемы во время выполнения приложения.
+ Улучшенную безопасность: AOT-компиляция позволяет обнаружить потенциальные уязвимости в коде на этапе сборки, что помогает улучшить безопасность приложения.
+ AOT-компиляция в Angular может быть выполнена с помощью Angular CLI, добавив флаг --aot при выполнении команды сборки, например: ng build --aot .

## 3. `Что такое динамические компоненты?`

Динамические компоненты в Angular позволяют создавать и добавлять компоненты в приложение во время выполнения. Они представляют собой способ генерации и управления компонентами динамически, без необходимости определения их статически в шаблоне.

Для создания динамических компонентов в Angular используются методы createComponent() и ComponentFactoryResolver. Метод createComponent() позволяет создавать экземпляры компонентов, а ComponentFactoryResolver используется для получения фабрики компонента, которую можно использовать для создания экземпляров компонента.

Пример использования динамических компонентов в Angular:
```javascript
import { Component, ComponentFactoryResolver, ViewChild, ViewContainerRef } from '@angular/core';

@Component({
  template: `<div><ng-container #dynamicContent></ng-container></div>`,
})
export class AppComponent {
  @ViewChild("dynamicContent", { read: ViewContainerRef })
  public dynamicContainer: ViewContainerRef;

  constructor(private componentFactoryResolver: ComponentFactoryResolver) {}

  createDynamicComponent() {
    // Получение фабрики компонента
    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(DynamicComponent);

    // Создание экземпляра компонента
    const componentRef = this.dynamicContainer.createComponent(componentFactory);
  }
}
```
В приведенном примере AppComponent содержит ViewContainerRef, который представляет контейнер для динамически создаваемых компонентов. Метод createDynamicComponent() использует ComponentFactoryResolver для получения фабрики компонента DynamicComponent, а затем создает экземпляр компонента с помощью createComponent().

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




## 4. `Что такое модули в Angular?`

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

Модули в Angular предоставляют следующие преимущества:

Логическая организация: Модули позволяют разделить функциональность приложения на логические блоки, что делает код более понятным и поддерживаемым.
Изоляция: Каждый модуль имеет свою собственную область видимости, что позволяет изолировать компоненты и сервисы от других частей приложения.
Ленивая загрузка: Модули могут быть загружены только по требованию, что улучшает производительность приложения и уменьшает время загрузки.
Переиспользование: Модули могут быть повторно использованы в разных приложениях или в разных частях одного приложения.

NgModule - это декоратор, который используется для определения модуля в Angular. Он применяется к классу модуля и принимает объект конфигурации, который определяет компоненты, сервисы и другие ресурсы, связанные с модулем.

Пример использования декоратора NgModule:
```javascript
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';

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


В приведенном примере AppModule является корневым модулем приложения. Он импортирует BrowserModule, который предоставляет функциональность для работы с браузером, и объявляет AppComponent в качестве компонента, который будет использоваться в модуле.

## 5. `Что такое сервисы в Angular?`

Сервисы в Angular - это классы, которые предоставляют функциональность и могут быть использованы в разных частях приложения. Они используются для разделения логики и общих функций между компонентами, директивами и другими классами Angular.

Сервисы в Angular обычно используются для выполнения следующих задач:

Получение данных с сервера или других источников данных.
Хранение и обработка данных, которые должны быть доступны в разных частях приложения.
Реализация общей функциональности, такой как аутентификация, логирование и обработка ошибок.
Взаимодействие с внешними библиотеками или сервисами.
Сервисы в Angular могут быть созданы с помощью ключевого слова @Injectable и зарегистрированы в модуле приложения или компоненте с помощью массива providers. Это позволяет Angular создавать и предоставлять экземпляр сервиса внедрения зависимостей (DI) при создании компонента или другого класса.

Пример регистрации сервиса в модуле Angular:
```javascript
import { NgModule } from '@angular/core';
import { MyService } from './my.service';

@NgModule({
  providers: [MyService]
})
export class AppModule { }
```

После регистрации сервиса в модуле, он может быть внедрен в компоненты или другие классы, используя DI. Например, в компоненте можно внедрить сервис следующим образом:
```javascript
import { Component } from '@angular/core';
import { MyService } from './my.service';

@Component({
  selector: 'app-my-component',
  template: '...',
})
export class MyComponent {
  constructor(private myService: MyService) { }
}
```

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


## 6. `Что такое жизненный цикл компонента в Angular?`

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

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

+ ngOnChanges: Этот метод вызывается, когда значения входных свойств компонента изменяются. Он принимает объект SimpleChanges, который содержит информацию о предыдущих и текущих значениях входных свойств..
+ ngOnInit: Этот метод вызывается после того, как Angular инициализирует компонент и устанавливает входные свойства. Он используется для выполнения инициализационных действий, таких как получение данных с сервера или настройка компонента..
+ ngDoCheck: Этот метод вызывается при каждом изменении в компоненте, включая изменения входных свойств, события и обнаружение изменений, которые Angular не может обнаружить самостоятельно. Он позволяет разработчикам выполнять дополнительные проверки и действия при изменении компонента..
+ ngAfterContentInit: Этот метод вызывается после того, как Angular вставляет внешний контент в представление компонента. Он используется для выполнения действий, которые требуют доступа к внешнему контенту, например, инициализация дочерних компонентов..
+ ngAfterContentChecked: Этот метод вызывается после каждой проверки внешнего контента компонента. Он используется для выполнения действий, которые требуют доступа к внешнему контенту и проверки его изменений..
+ ngAfterViewInit: Этот метод вызывается после инициализации представления компонента и его дочерних компонентов. Он используется для выполнения действий, которые требуют доступа к представлению компонента, например, инициализация сторонних библиотек или установка обработчиков событий..
+ ngAfterViewChecked: Этот метод вызывается после каждой проверки представления компонента и его дочерних компонентов. Он используется для выполнения действий, которые требуют доступа к представлению компонента и проверки его изменений..
+ ngOnDestroy: Этот метод вызывается перед уничтожением компонента. Он используется для выполнения действий, таких как отписка от подписок, очистка ресурсов или отмена запущенных процессов..

Пример использования методов жизненного цикла компонента в Angular:
```javascript
import { Component, OnInit, OnDestroy } from '@angular/core';

@Component({
  selector: 'app-my-component',
  template: `
    <h1>{{ title }}</h1>
  `
})
export class MyComponent implements OnInit, OnDestroy {
  title: string;

  ngOnInit() {
    this.title = 'Hello, Angular!';
    console.log('Component initialized');
  }

  ngOnDestroy() {
    console.log('Component destroyed');
  }
}
```

В приведенном выше примере компонент MyComponent реализует интерфейсы OnInit и OnDestroy, что позволяет использовать методы ngOnInit и ngOnDestroy. В методе ngOnInit устанавливается значение переменной title и выводится сообщение в консоль при инициализации компонента. В методе ngOnDestroy выводится сообщение в консоль перед уничтожением компонента.

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


## 8. `Чем наблюдаемые отличаются от обещаний?`

В Angular, наблюдаемые (observables) и обещания (promises) являются двумя разными концепциями для работы с асинхронными операциями. Вот некоторые основные различия между ними:

Наблюдаемые (observables):

+ Наблюдаемые представляют собой поток данных, который может иметь несколько значений, передаваемых по мере их поступления.
+ Они поддерживают операторы, такие как map, filter, reduce и другие, которые позволяют манипулировать данными в потоке.
+ Наблюдаемые могут быть отменены или отписаны с помощью метода unsubscribe.
+ Они широко используются в Angular для работы с асинхронными операциями, такими как HTTP-запросы или события пользовательского интерфейса.

Обещания (promises):

+ Обещания представляют собой единственное значение, которое будет доступно в будущем, либо успешно, либо с ошибкой.
+ Они поддерживают методы, такие как then, catch, finally, которые позволяют обрабатывать успешное выполнение, ошибку или выполнение в любом случае.
+ Обещания не могут быть отменены или отписаны после того, как они были выполнены.
+ Они также широко используются в Angular для работы с асинхронными операциями, но наблюдаемые предпочтительнее в некоторых случаях, особенно когда нужно работать с потоками данных.


Таким образом, основные различия между наблюдаемыми и обещаниями в Angular заключаются в том, что наблюдаемые представляют собой поток данных с возможностью манипуляции, отмены и отписки, в то время как обещания представляют собой единственное значение, которое будет доступно в будущем.

## 9. `Что такое бутстрэппинг?`

Бутстрэппинг в Angular - это процесс инициализации и запуска приложения Angular. Во время бутстрэппинга Angular создает корневой компонент приложения и связывает его с DOM-элементом на странице. Затем Angular загружает и компилирует компоненты, устанавливает связи между компонентами и их шаблонами, и запускает приложение.

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

Бутстрэппинг в Angular обычно выполняется в файле main.ts, где вызывается функция platformBrowserDynamic().bootstrapModule(AppModule), где AppModule - это модуль приложения, который содержит корневой компонент и другие компоненты, сервисы и зависимости.

Пример кода:
```javascript
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/app.module';

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.error(err));
```

В этом примере AppModule - это модуль приложения, который содержит корневой компонент и другие компоненты, сервисы и зависимости. Функция platformBrowserDynamic().bootstrapModule(AppModule) запускает процесс бутстрэппинга, и Angular начинает загружать и компилировать компоненты, устанавливать связи и запускать приложение.

## 10. `Что вы подразумеваете под внедрением зависимостей?`

Angular - это платформа для разработки веб-приложений, которая позволяет создавать масштабируемые и эффективные приложения с использованием компонентной архитектуры. Внедрение зависимостей (Dependency Injection, DI) является одним из ключевых концепций в Angular.

Под внедрением зависимостей в Angular подразумевается механизм, который позволяет компонентам и сервисам получать необходимые им зависимости извне, вместо того, чтобы создавать их самостоятельно. Это позволяет создавать слабосвязанные компоненты и сервисы, что упрощает тестирование, повторное использование кода и обеспечивает более гибкую архитектуру приложения.

Когда компонент или сервис требует определенную зависимость, Angular автоматически создает экземпляр этой зависимости и предоставляет его внутри компонента или сервиса. Это позволяет избежать необходимости явного создания и управления зависимостями вручную.

Пример использования внедрения зависимостей в Angular:
```javascript
import { Component, Injectable } from '@angular/core';

@Injectable()
export class DataService {
  getData(): string {
    return 'Some data';
  }
}

@Component({
  selector: 'app-example',
  template: `
    <h1>{{ data }}</h1>
  `,
})
export class ExampleComponent {
  constructor(private dataService: DataService) {}

  ngOnInit() {
    this.data = this.dataService.getData();
  }
}
```


В приведенном примере DataService является сервисом, который предоставляет данные. Компонент ExampleComponent требует эту зависимость и получает ее через конструктор. Angular автоматически создает экземпляр DataService и предоставляет его внутри ExampleComponent.


## 11. `Описать аутентификацию и авторизацию Angular.`

Аутентификация и авторизация являются важными аспектами разработки веб-приложений. В Angular есть несколько подходов к реализации аутентификации и авторизации, включая использование JSON Web Tokens (JWT) и HttpInterceptor.

Аутентификация с использованием JSON Web Tokens (JWT): JSON Web Tokens (JWT) - это открытый стандарт (RFC 7519), который определяет компактный и самодостаточный формат для представления информации об аутентификации в виде JSON-объекта. В Angular вы можете использовать JWT для аутентификации пользователей.

Для реализации аутентификации с использованием JWT в Angular, вам потребуется:

Создать серверную часть, которая будет генерировать и проверять JWT-токены.
Реализовать механизм хранения токена на клиентской стороне (например, в localStorage или sessionStorage).
Создать сервис аутентификации в Angular, который будет отправлять запросы на сервер для аутентификации и получения токена, а также сохранять и проверять токен на клиентской стороне.
Авторизация с использованием HttpInterceptor: HttpInterceptor - это механизм в Angular, который позволяет перехватывать и изменять HTTP-запросы и ответы. Вы можете использовать HttpInterceptor для авторизации запросов, добавляя заголовки авторизации или проверяя токены доступа.

Для реализации авторизации с использованием HttpInterceptor в Angular, вам потребуется:

+ Создать класс, реализующий интерфейс HttpInterceptor.
+ В классе HttpInterceptor реализовать методы для перехвата и изменения HTTP-запросов и ответов.
+ Зарегистрировать HttpInterceptor в провайдере приложения, чтобы он был доступен для использования во всем приложении.

Примеры кода:

+ Аутентификация с использованием JWT:
```javascript
// Сервис аутентификации
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class AuthService {
  constructor(private http: HttpClient) {}

  login(username: string, password: string) {
    return this.http.post('/api/auth/login', { username, password });
  }
}

// Компонент для входа пользователя
import { Component } from '@angular/core';
import { AuthService } from './auth.service';

@Component({
  selector: 'app-login',
  template: `
    <form (ngSubmit)="login()">
      <input type="text" [(ngModel)]="username" name="username" placeholder="Username">
      <input type="password" [(ngModel)]="password" name="password" placeholder="Password">
      <button type="submit">Login</button>
    </form>
  `,
})
export class LoginComponent {
  username: string;
  password: string;

  constructor(private authService: AuthService) {}

  login() {
    this.authService.login(this.username, this.password).subscribe(
      (response) => {
        // Сохранение токена на клиентской стороне
        localStorage.setItem('token', response.token);
      },
      (error) => {
        console.error('Ошибка аутентификации:', error);
      }
    );
  }
}

```


+ Авторизация с использованием HttpInterceptor:
```javascript
// HttpInterceptor
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // Получение токена из localStorage
    const token = localStorage.getItem('token');

    // Добавление заголовка авторизации
    if (token) {
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${token}`
        }
      });
    }

    return next.handle(request);
  }
}

// Регистрация HttpInterceptor в провайдере приложения
import { NgModule } from '@angular/core';
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
import { AuthInterceptor } from './auth.interceptor';

@NgModule({
  imports: [HttpClientModule],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: AuthInterceptor,
      multi: true
    }
  ]
})
export class CoreModule {}
```

Обратите внимание: Это только примеры кода для демонстрации основных концепций аутентификации и авторизации в Angular. Реальная реализация может варьироваться в зависимости от требований вашего приложения.

## 12. `Что такое процесс цикла дайджеста в Angular?`

В Angular процесс цикла дайджеста (digest cycle) является ключевым механизмом для обновления данных и обновления представления. Во время цикла дайджеста Angular проверяет все связанные скоупы (scopes) и выполняет проверку изменений в данных. Если происходят изменения, Angular обновляет представление, чтобы отразить эти изменения.

Процесс цикла дайджеста в Angular состоит из следующих шагов:

+ Запуск цикла дайджеста: Цикл дайджеста запускается в ответ на событие, такое как пользовательское действие или изменение данных.
+ Проверка изменений: Angular проверяет все скоупы (scopes) и их модели данных на наличие изменений. Он сравнивает текущие значения с предыдущими значениями и определяет, какие из них изменились.
+ Применение изменений: Если Angular обнаруживает изменения в данных, он обновляет представление, чтобы отразить эти изменения. Это может включать обновление текста, добавление или удаление элементов DOM и другие изменения в пользовательском интерфейсе.
+ Проверка изменений вложенных скоупов: Angular также проверяет изменения во всех вложенных скоупах и их моделях данных.
+ Повторение цикла дайджеста: Цикл дайджеста повторяется до тех пор, пока не будет достигнуто состояние стабильности, то есть пока не будет обнаружено никаких изменений в данных или представлении.

Цикл дайджеста в Angular позволяет обеспечить синхронизацию данных и представления, что делает фреймворк мощным инструментом для разработки динамических веб-приложений.

## 13. `Что такое Angular Router?`

Angular Router - это сервис в Angular, который позволяет осуществлять навигацию между различными представлениями приложения. Он позволяет переходить от одного представления к другому в процессе выполнения пользовательских задач.

Angular Router предоставляет механизм для определения маршрутов и их связывания с компонентами приложения. Он позволяет определить, какой компонент должен быть отображен при переходе по определенному URL-адресу или при выполнении определенного действия пользователем.

Чтобы использовать Angular Router, необходимо импортировать соответствующие модули и классы. Например, для определения маршрутов и настройки маршрутизации в Angular, вы можете использовать классы Routes и RouterModule из модуля @angular/router.

Пример использования Angular Router для определения маршрутов выглядит следующим образом:
```javascript
import { Routes, RouterModule } from '@angular/router';

const routes: Routes = [
  { path: 'home', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  { path: 'contact', component: ContactComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }
```

В этом примере мы определяем три маршрута: 'home', 'about' и 'contact', и связываем каждый маршрут с соответствующим компонентом.

Angular Router также предоставляет множество других возможностей, таких как параметры маршрута, защита маршрутов, вложенные маршруты и многое другое. Он является важной частью разработки приложений на Angular и обеспечивает гибкую и мощную систему навигации внутри приложения.


## 14. `Что такое REST?`
REST API в Angular - это способ взаимодействия с сервером, используя протокол HTTP и стандартные методы запросов, такие как GET, POST, PUT и DELETE. В Angular, для работы с REST API, можно использовать сервис HttpClient, который предоставляет удобные методы для отправки HTTP-запросов и получения ответов от сервера.

REST API в Angular позволяет вам обмениваться данными с сервером и выполнять различные операции, такие как получение, создание, обновление и удаление данных. Он является важной частью разработки веб-приложений на Angular и позволяет создавать мощные и интерактивные приложения.

Обратите внимание, что RESTful API не является частью Angular-приложения. RESTful API - это веб-сервис, написанный на серверной стороне, который может использоваться Angular-приложением для взаимодействия с сервером

Для работы с REST API в Angular можно использовать модуль HttpClient, который предоставляет удобные методы для отправки HTTP-запросов и получения ответов. Вот некоторые основные шаги для работы с REST API в Angular:

+ Импортируйте модуль HttpClientModule в вашем Angular-приложении.
```javascript
import { HttpClientModule } from '@angular/common/http';
Добавьте HttpClientModule в раздел imports в файле AppModule.

@NgModule({
  imports: [
    HttpClientModule
  ],
  // ...
})
export class AppModule { }
```

+ В вашем компоненте или сервисе импортируйте HttpClient и используйте его для отправки HTTP-запросов.
```javascript
import { HttpClient } from '@angular/common/http';

constructor(private http: HttpClient) { }

// Пример GET-запроса
getData() {
  return this.http.get('https://api.example.com/data');
}

// Пример POST-запроса
postData(data: any) {
  return this.http.post('https://api.example.com/data', data);
}
```

+ Вызовите методы getData() или postData() для отправки запросов и получения данных.
```javascript
this.getData().subscribe((response) => {
  console.log(response);
}, (error) => {
  console.error(error);
});
```

Примечание: Важно помнить, что HTTP-запросы асинхронны, поэтому для получения данных необходимо использовать методы подписки, такие как subscribe().

Это основные шаги для работы с REST API в Angular. Вы также можете использовать другие методы, такие как PUT и DELETE, для взаимодействия с API.

## 15. `Объясните Angular CLI.`

Angular CLI (Command Line Interface) - это инструмент командной строки, который предоставляет разработчикам возможность создавать, развивать и поддерживать проекты на Angular. Он предоставляет набор команд, которые упрощают различные задачи, связанные с разработкой Angular-приложений.

Основные возможности Angular CLI:
+ Создание нового проекта: Angular CLI позволяет создавать новые проекты с помощью команды ng new. Он автоматически настраивает структуру проекта, устанавливает зависимости и создает основные файлы и папки, необходимые для разработки Angular-приложения.
+ Генерация компонентов, сервисов и других элементов: Angular CLI предоставляет команды для генерации различных элементов приложения, таких как компоненты, сервисы, директивы и многое другое. Например, команда ng generate component my-component создаст новый компонент с именем "my-component" и соответствующими файлами и кодом.
+ Запуск локального сервера разработки: Angular CLI позволяет запускать локальный сервер разработки с помощью команды ng serve. Это позволяет разработчикам видеть изменения в реальном времени при разработке приложения и автоматически перезагружать страницу при внесении изменений в код.
+ Сборка и оптимизация проекта: Angular CLI предоставляет команды для сборки и оптимизации проекта перед его развертыванием. Например, команда ng build собирает проект в определенную директорию, готовую для развертывания на сервере.
+ Тестирование приложения: Angular CLI предоставляет инструменты для запуска и выполнения тестов в Angular-приложении. Это позволяет разработчикам автоматизировать тестирование и обнаруживать потенциальные проблемы и ошибки в приложении.
+ Интеграция с другими инструментами: Angular CLI интегрируется с другими инструментами разработки, такими как Angular DevTools, которые предоставляют дополнительные возможности для отладки и анализа Angular-приложений.


Пример использования Angular CLI:
```javascript
// my-component.component.ts
@Component({ /* .. */ })
export class MyComponent {
  constructor(private rest: RestService) {}

  // Примеры работы с Observable
  public getFields() {
    this.rest.getByObservable('http://anyurl.com').subscribe(value => {
      // Обработка значения
    }, error => {
      // Обработка ошибки
    });
  }

  // Примеры работы с Promise
  public async getAsyncField() {
    try {
      const value = await this.rest.getByPromise('http://anyurl.com');
      // Обработка значения
    } catch (error) {
      // Обработка ошибки
    }
  }
}
```
Вот некоторые команды Angular CLI, которые могут быть полезны при разработке Angular-приложений:

+ `ng new <project-name>`: создает новый проект Angular.
+ `ng generate component <component-name`>: генерирует новый компонент.
+ `ng serve`: запускает локальный сервер разработки.
+ `ng build`: собирает проект для развертывания.
+ `ng test`: запускает тесты в приложении.

## 16. `Что такое схема?`

Angular schematics - это инструмент, который используется в Angular CLI для создания и применения трансформаций к проектам веб-приложений на Angular. С помощью схематиков можно модифицировать существующие схематики и создавать новые, чтобы, например, обновлять код или добавлять новый функционал в проекты.

Angular схематики представляют собой набор правил и шаблонов, которые определяют, какой код должен быть сгенерирован или изменен в проекте. Они могут использоваться для создания различных элементов, таких как компоненты, директивы, модули, сервисы и другие.

Например, с помощью схематиков можно создать новый компонент в проекте Angular CLI с помощью команды ng generate component. Это приведет к созданию соответствующих файлов компонента, включая шаблон, стили и код компонента.

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

Примеры схематиков Angular:

+ app-shell: генерирует оболочку приложения для запуска серверной версии приложения.
+ component: создает новый компонент.
+ directive: создает новую директиву.
+ module: создает новый модуль NgModule.

Схематики Angular предоставляют мощный инструмент для автоматизации разработки проектов на Angular и упрощения процесса создания и изменения кода. Они помогают разработчикам сэкономить время и уменьшить вероятность ошибок при создании и обновлении кода.

## 17. `Что такое HttpClient и каковы его преимущества?`

HttpClient - это модуль в Angular, который предоставляет возможность выполнять HTTP-запросы к серверу. Он является частью пакета @angular/common/http и предоставляет удобный интерфейс для работы с HTTP-протоколом.

Преимущества HttpClient в Angular включают:

+ Удобство использования: HttpClient предоставляет простой и интуитивно понятный API для выполнения HTTP-запросов. Он предоставляет методы для отправки GET, POST, PUT, DELETE и других типов запросов.
+ Обработка ошибок: HttpClient предоставляет механизмы для обработки ошибок при выполнении HTTP-запросов. Он автоматически обрабатывает ошибки сети, такие как отсутствие соединения или недоступность сервера, и предоставляет возможность обрабатывать ошибки, возвращаемые сервером.
+ Поддержка интерсепторов: HttpClient поддерживает использование интерсепторов, которые позволяют изменять и расширять запросы и ответы. Интерсепторы могут использоваться для добавления заголовков, обработки аутентификации, кэширования и других задач.
+ Поддержка асинхронности: HttpClient предоставляет возможность выполнения асинхронных HTTP-запросов. Он возвращает объект Observable, который позволяет подписываться на результаты запроса и получать их асинхронно.
+ Поддержка типизации: HttpClient поддерживает типизацию данных, возвращаемых сервером. Он позволяет указывать ожидаемый тип данных и автоматически преобразовывать ответ сервера в указанный тип.

## 18. `Что такое многоадресная рассылка в Angular?`

Многоадресная рассылка в Angular - это механизм, который позволяет отправлять данные одновременно нескольким получателям. В Angular многоадресная рассылка обычно используется с помощью объекта Observable из библиотеки RxJS. Observable представляет собой источник данных, который может быть подписан на несколько наблюдателей, чтобы они получали обновления данных одновременно.

Пример использования многоадресной рассылки в Angular:
```javascript
import { Observable } from 'rxjs';

// Создание Observable
const observable = new Observable((observer) => {
  // Генерация данных
  observer.next('Первое сообщение');
  observer.next('Второе сообщение');
  observer.next('Третье сообщение');
});

// Подписка на Observable
observable.subscribe((data) => {
  console.log(data);
});
```

В этом примере создается Observable, который генерирует три сообщения. Затем мы подписываемся на этот Observable и выводим полученные сообщения в консоль. Каждый подписчик на Observable будет получать все сообщения одновременно.

## 19. `Что такое директива в Angular?`
Директива в Angular - это специальная конструкция, которая позволяет расширять функциональность HTML элементов или создавать собственные элементы с определенным поведением. Директивы позволяют добавлять новые атрибуты, классы или стили к элементам, а также реагировать на события и изменять их внешний вид или поведение.

Директивы в Angular могут быть двух типов: структурные и атрибутные.

Структурные директивы изменяют структуру DOM-дерева, добавляя или удаляя элементы из разметки. Примеры структурных директив в Angular: ngIf, ngFor, ngSwitch.

Атрибутные директивы изменяют внешний вид или поведение элемента, к которому они применяются. Примеры атрибутных директив в Angular: ngStyle, ngClass, ngModel.

Директивы в Angular объявляются с помощью декоратора @Directive и могут содержать различные хуки жизненного цикла, которые позволяют выполнять определенные действия при создании, изменении или удалении директивы.

Например, вот пример директивы в Angular:
```javascript
import { Directive, ElementRef } from '@angular/core';

@Directive({
  selector: '[myDirective]'
})
export class MyDirective {
  constructor(private elementRef: ElementRef) {
    // Используем ElementRef для доступа к элементу, к которому применяется директива
    this.elementRef.nativeElement.style.backgroundColor = 'red';
  }
}
```


В этом примере директива MyDirective применяется к элементу с атрибутом myDirective и устанавливает красный фон для этого элемента.







## 23. `Как обмениваться данными между компонентами в Angular?`

## 24. `Что такое складывание?`

## 25. `Что такое NoopZone?`





## 26. `Что такое макросы?`



## 27. `Какова цель общего модуля в Angular?`




## 28. `Какие типы компиляторов используются в Angular?`

## 29. `Какова поддержка Angular Elements в браузере?`

## 30. `Какова роль SPA в Angular?`



## 31. `Что произойдет, если вы не предоставите обработчик для наблюдателя?`

## 32. `Что вы подразумеваете под интерполяцией строк?`

## 33. `Что вы подразумеваете под привязкой данных?`

## 34. `Что такое проекция контента?`

## 35. `Что такое шаблонные выражения?`



## 35. `Что такое двусторонняя привязка данных в Angular?`



## 36. `Что такое декораторы и их типы в Angular?`

## 43. `Что такое обнаружение изменений и как работает механизм обнаружения изменений?`

## 44. `Что происходит, когда вы используете тег скрипта в шаблоне?`

## 45. `Когда использовать директиву?`

## 46. `Что такое интерполяция?`

## 47. `В чем разница между чистой и нечистой трубой?`

## 48. `Что такое наблюдаемые?`

## 49. `Что такое пользовательские элементы?`

## 50. `Каковы различные виды директив?`

## 51. `Всегда ли нам нужен модуль маршрутизации?`

## 52. `Что такое (JIT)?`

## 53. `Какова цель файлов метаданных JSON?`

## 54. `Как вы описываете различные зависимости в приложениях Angular?`

## 55. `Что такое декораторы классов в Angular?`

## 56. `Что произойдет, если я импортирую один и тот же модуль дважды?`

## 57. `Каковы способы запуска обнаружения изменений в Angular?`

## 58. `Каковы принципы безопасности в angular?`

## 59. `Каковы принципы безопасности в angular?`

## 60. `Что такое интерфейс командной строки Schematics?`

## 70. `В чем разница между ViewEncapsulation и Shadow DOM в Angular?`

## 71. `Что такое защита маршрута в Angular?`

## 72. `Что такое угловой материал?`

## 73. `Какова цель декоратора NgModule в Angular?`

## 74. `Что такое внедрение зависимостей в Angular?`

## 75. `В чем разница между HttpClient и Http в Angular?`

## 76. `В чем разница между HttpClient и Http в Angular?`

## 77. `Какова цель элемента ng-container в Angular?`

## 78. `Что такое угловая защита?`

## 79. `В чем разница между асинхронным каналом и методом подписки в Angular?`

## 80. `Как вы обмениваетесь данными между компонентами в Angular?`

## 81. `Что такое преобразователь в Angular?`

## 82. `Что такое провайдер в Angular?`

## 83. `В чем разница между сервисом и компонентом в Angular?`

## 84. `В чем разница между ElementRef и Renderer2 в Angular?`

## 85. `В чем разница между формой, управляемой шаблоном, и реактивной формой в Angular?`

## 86. `Что такое сервисный работник Angular?`

## 87. `В чем разница между шаблоном и представлением в Angular?`

## 88. `Что такое механизм обнаружения изменений Angular?`

## 89. `В чем разница между сервисом и компонентом в Angular?`

## 90. `Что такое ссылочная переменная шаблона Angular?`

## 91. `Что такое декоратор ViewChild в Angular?`

## 92. `В чем разница между формой, управляемой шаблоном, и реактивной формой в Angular?`

## 93. `Что такое модуль Angular?`

## 94. `Что такое NgZone в Angular?`

## 95. `В чем разница между ngOnInit и ngAfterViewInit в Angular?`

## 96. `Какова цель декоратора HostListener в Angular?`

## 97. `Какова цель директивы ng-template в Angular?`

## 98. `Какова цель службы ActivatedRoute в Angular?`

## 99. `Какова цель синтаксиса async/await в Angular?`

## 100. `Какова цель директивы ngClass в Angular?`
