Как правильно подключить NavbarComponent к шаблону компонента приложения?
app.comComponent.html
<app-navbar></app-navbar>
<router-outlet></router-outlet>
main.ts
import {CdkTableModule} from '@angular/cdk/table';
import {NgModule} from '@angular/core';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import {bootstrapApplication, BrowserModule} from '@angular/platform-browser';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {MatAutocompleteModule} from "@angular/material/autocomplete";
import {MatButtonModule} from "@angular/material/button";
import {MatButtonToggleModule} from "@angular/material/button-toggle";
import {MatCardModule} from "@angular/material/card";
import {MatCheckboxModule} from "@angular/material/checkbox";
import {MatChipsModule} from "@angular/material/chips";
import {MatStepperModule} from "@angular/material/stepper";
import {MatDatepickerModule} from "@angular/material/datepicker";
import {MatDialogModule} from "@angular/material/dialog";
import {MatDividerModule} from "@angular/material/divider";
import {MatExpansionModule} from "@angular/material/expansion";
import {MatGridListModule} from "@angular/material/grid-list";
import {MatIconModule} from "@angular/material/icon";
import {MatInputModule} from "@angular/material/input";
import {MatListModule} from "@angular/material/list";
import {MatMenuModule} from "@angular/material/menu";
import {MatNativeDateModule, MatRippleModule} from "@angular/material/core";
import {MatPaginatorModule} from "@angular/material/paginator";
import {MatProgressBarModule} from "@angular/material/progress-bar";
import {MatProgressSpinnerModule} from "@angular/material/progress-spinner";
import {MatRadioModule} from "@angular/material/radio";
import {MatSelectModule} from "@angular/material/select";
import {MatSidenavModule} from "@angular/material/sidenav";
import {MatSliderModule} from "@angular/material/slider";
import {MatSlideToggleModule} from "@angular/material/slide-toggle";
import {MatSnackBarModule} from "@angular/material/snack-bar";
import {MatTabsModule} from "@angular/material/tabs";
import {MatToolbarModule} from "@angular/material/toolbar";
import {MatTooltipModule} from "@angular/material/tooltip";
import {MatTableModule} from '@angular/material/table';
import {provideHttpClient} from "@angular/common/http";
import {RouterModule} from '@angular/router';
import {AppComponent} from "./app/app.component";
import {appConfig} from "./app/app.config";
import {UserListComponent} from "./app/user-list/user-list.component";
import {CarListComponent} from "./app/cars-list/car-list.component";
import {CarComponent} from "./app/car/car.component";
import { routes } from './app/app.routes';
import {MatSortModule} from "@angular/material/sort";
import {UserCarsComponent} from "./app/user-cars/user-cars.component";
import {UserComponent} from "./app/user/user.component";
import {CommonModule} from "@angular/common";
import {NavbarComponent} from "./app/navbar/navbar.component";
@NgModule({
exports: [
CdkTableModule,
MatAutocompleteModule,
MatButtonModule,
MatButtonToggleModule,
MatCardModule,
MatCheckboxModule,
MatChipsModule,
MatStepperModule,
MatDatepickerModule,
MatDialogModule,
MatDividerModule,
MatExpansionModule,
MatGridListModule,
MatIconModule,
MatInputModule,
MatListModule,
MatMenuModule,
MatNativeDateModule,
MatPaginatorModule,
MatProgressBarModule,
MatProgressSpinnerModule,
MatRadioModule,
MatRippleModule,
MatSelectModule,
MatSidenavModule,
MatSliderModule,
MatSlideToggleModule,
MatSnackBarModule,
MatTableModule,
MatTabsModule,
MatToolbarModule,
MatTooltipModule,
MatDialogModule,
MatGridListModule,
MatSortModule
]
})
export class DemoMaterialModule {}
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
DemoMaterialModule,
MatNativeDateModule,
ReactiveFormsModule,
RouterModule.forRoot(routes),
CommonModule
],
declarations: [UserListComponent, UserComponent, CarListComponent, CarComponent, UserCarsComponent, NavbarComponent],
bootstrap: [],
exports: [
NavbarComponent
],
providers: [provideHttpClient()]
})
export class AppModule {}
bootstrapApplication(AppComponent, appConfig)
.catch((err) => console.error(err));
navbar.comComponent.html
<mat-toolbar color = "primary">
<div class = "container-fluid">
<a class = "navbar-brand" routerLink = "/">Cars App</a>
<button mat-icon-button (click) = "toggleNavbar()">
<mat-icon>menu</mat-icon>
</button>
<div class = "collapse navbar-collapse nav nav-underline" [class.show] = "isNavbarOpen" id = "navbarNav">
<ul class = "navbar-nav">
<li class = "nav-item">
<a class = "nav-link" routerLink = "/users">Users</a>
</li>
<li class = "nav-item">
<a class = "nav-link" routerLink = "/cars">Cars</a>
</li>
</ul>
</div>
</div>
</mat-toolbar>
navbar.comComponent.ts
import {Component} from '@angular/core';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css'],
})
export class NavbarComponent {
isNavbarOpen = false;
toggleNavbar() {
this.isNavbarOpen = !this.isNavbarOpen;
}
}
app.comComponent.ts
import { Component } from '@angular/core';
import {RouterOutlet} from '@angular/router';
import { AppModule } from '../main';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
standalone: true,
imports: [AppModule, RouterOutlet]
})
export class AppComponent {
title = 'webapp';
}
ОБНОВЛЯТЬ:
Когда я сделал NavbarComponent автономным и внес изменения в его подключение.
navbar.comComponent.ts
import {Component} from '@angular/core';
import {MatToolbar} from "@angular/material/toolbar";
import {MatIcon} from "@angular/material/icon";
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css'],
standalone: true,
imports: [
MatToolbar,
MatIcon
]
})
export class NavbarComponent {
isNavbarOpen = false;
toggleNavbar() {
this.isNavbarOpen = !this.isNavbarOpen;
}
}
Он компилируется, но в браузере та же ошибка.
Код:
https://github.com/mr-olufsen/webapp
ОБНОВЛЕНИЕ 2:
Решение, в котором NavbarComponent интегрирован и отображается правильно, находится здесь. Код. Хотя сортировка таблиц в данный момент не работает
Нет, я использую не автономный подход
Приложение было преобразовано в автономное. Ниже были выполнены следующие шаги.
Создал модуль приложения и загрузил его.
@NgModule({
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
DemoMaterialModule,
MatNativeDateModule,
ReactiveFormsModule,
RouterModule.forRoot(routes),
RouterModule,
CommonModule
],
declarations: [
AppComponent,
NavbarComponent,
UserListComponent,
UserComponent,
CarListComponent,
CarComponent,
UserCarsComponent,
],
bootstrap: [AppComponent],
exports: [
],
providers: [provideHttpClient()]
})
export class AppModule {}
platformBrowserDynamic().bootstrapModule(AppModule, {
ngZoneEventCoalescing: true
})
.catch(err => console.error(err));
Удалены все автономные компоненты и добавлены в компонент приложения (чтобы иметь общий стиль для всего приложения (модульный)).
Во второй аргумент приложения начальной загрузки следует добавлять только поставщиков среды.
bootstrapApplication(AppComponent, { providers: [provideHttpClient(), provideRouter(routes), ] })
.catch((err) => console.error(err));
Затем просто импортируйте модули в автономные компоненты, чтобы компонент мог их использовать. Обратите внимание: в компоненте можно использовать только экспортированные элементы.
Сначала мы можем преобразовать панель навигации в автономную.
import {Component} from '@angular/core';
@Component({
selector: 'app-navbar',
templateUrl: './navbar.component.html',
styleUrls: ['./navbar.component.css'],
standalone: true,
})
export class NavbarComponent {
isNavbarOpen = false;
toggleNavbar() {
this.isNavbarOpen = !this.isNavbarOpen;
}
}
Затем используйте его в компоненте приложения.
app.comComponent.ts
import { Component } from '@angular/core';
import {RouterOutlet} from '@angular/router';
import {NavbarComponent} from './src/navbar';
import { AppModule } from '../main';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
standalone: true,
imports: [AppModule, RouterOutlet, NavbarComponent]
})
export class AppComponent {
title = 'webapp';
}
При работе в автономном режиме указанные ниже модули не нужны.
BrowserModule,
BrowserAnimationsModule,
RouterModule.forRoot(routes),
Спасибо. Другие мои компоненты не являются автономными. Я хочу быть последовательным и сделать NavbarComponent таким же образом. Как его подключить?
Я пытаюсь понять, как сделать AppComponent неавтономным.
@J.Olufsen, ты хочешь автономный или модульный? для всего приложения, потому что изначально вы говорили об автономном
Я хочу иметь самый быстрый способ 1. добавить панель навигации 2. если возможно, полностью переключиться на неавтономный подход, чтобы быть последовательным, потому что у меня уже большая часть функций работает таким образом. Например, все подключения в корневом файле main.ts выполняются неавтономным способом.
Мне удалось добавить Навбар, но, к сожалению, сортировка перестала работать. В чем может быть проблема? github.com/mr-olufsen/webapp/commit/…
@J.Olufsen обновил мой ответ, поскольку вы спросили, что ваше приложение теперь полностью модульное!
ваше приложение модульное или автономное?