Компонент Angular 18 импортируется как автономный компонент, но не отображается

Как правильно подключить 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 интегрирован и отображается правильно, находится здесь. Код. Хотя сортировка таблиц в данный момент не работает

ваше приложение модульное или автономное?

Naren Murali 25.06.2024 14:46

Нет, я использую не автономный подход

J.Olufsen 25.06.2024 15:14
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
563
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Приложение было преобразовано в автономное. Ниже были выполнены следующие шаги.

Создал модуль приложения и загрузил его.

@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));

Удалены все автономные компоненты и добавлены в компонент приложения (чтобы иметь общий стиль для всего приложения (модульный)).

Репозиторий Github


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

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 таким же образом. Как его подключить?

J.Olufsen 25.06.2024 15:21

Я пытаюсь понять, как сделать AppComponent неавтономным.

J.Olufsen 25.06.2024 15:29

@J.Olufsen, ты хочешь автономный или модульный? для всего приложения, потому что изначально вы говорили об автономном

Naren Murali 25.06.2024 15:31

Я хочу иметь самый быстрый способ 1. добавить панель навигации 2. если возможно, полностью переключиться на неавтономный подход, чтобы быть последовательным, потому что у меня уже большая часть функций работает таким образом. Например, все подключения в корневом файле main.ts выполняются неавтономным способом.

J.Olufsen 25.06.2024 16:52

Мне удалось добавить Навбар, но, к сожалению, сортировка перестала работать. В чем может быть проблема? github.com/mr-olufsen/webapp/commit/…

J.Olufsen 25.06.2024 19:21

@J.Olufsen обновил мой ответ, поскольку вы спросили, что ваше приложение теперь полностью модульное!

Naren Murali 26.06.2024 08:06

Другие вопросы по теме