Как использовать автономный компонент в неавтономном компоненте?

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

у меня есть этот компонент

import { ChangeDetectionStrategy, Component } from '@angular/core';

@Component({
  selector: 'app-three-d-viewer',
  standalone: true,
  templateUrl: './three-d-viewer.component.html',
  styleUrls: ['./three-d-viewer.component.css'],
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ThreeDViewerComponent {

}

Я хочу использовать is it my app.component, который является автономным компонентом.

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
}

Я хочу использовать это здесь

<div class = "layout">
  <app-three-d-viewer></app-three-d-viewer>
</div>

и это мой app.module

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { HttpClientModule } from '@angular/common/http';

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

Я получаю эту ошибку


Error: src/app/app.component.html:2:3 - error NG8001: 'app-three-d-viewer' is not a known element:
1. If 'app-three-d-viewer' is an Angular component, then verify that it is part of this module.
2. If 'app-three-d-viewer' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.

2   <app-three-d-viewer></app-three-d-viewer>
    ~~~~~~~~~~~~~~~~~~~~

  src/app/app.component.ts:6:16
    6   templateUrl: './app.component.html',
                     ~~~~~~~~~~~~~~~~~~~~~~
    Error occurs in the template of component AppComponent.

Я попробовал:

  1. импортируйте автономный компонент в ThreeDViewerComponent неавтономный компонент AppComponent с помощью imports: [ThreeDViewerComponent], но получите ошибку Error: src/app/app.component.ts:8:12 - error NG2010: 'imports' is only valid on a component that is standalone.

  2. Используя shared.module

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ThreeDViewerComponent } from './path/to/three-d-viewer.component';

@NgModule({
  declarations: [ThreeDViewerComponent],
  imports: [CommonModule],
  exports: [ThreeDViewerComponent]
})
export class SharedModule {}

и импортирую его в AppModule, но получаю эту ошибку:

Error: src/app/app.module.ts:14:5 - error NG6002: This import contains errors, which may affect components that depend on this NgModule.

14     SharedModule
       ~~~~~~~~~~~~


Error: src/app/shared.module.ts:6:18 - error NG6008: Component ThreeDViewerComponent is standalone, and cannot be declared in an NgModule. Did you mean to import it instead?

6   declarations: [ThreeDViewerComponent],
                   ~~~~~~~~~~~~~~~~~~~~~


Error: src/app/shared.module.ts:8:13 - error NG6004: Can't be exported from this NgModule, as it must be imported first

8   exports: [ThreeDViewerComponent]
              ~~~~~~~~~~~~~~~~~~~~~




× Failed to compile.

Что я могу сделать?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
248
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Автономный компонент не может быть объявлен (массив объявлений), когда он является автономным, поэтому его необходимо импортировать (массив импорта) в модуль верхнего уровня, который может использоваться всеми компонентами в массиве объявлений!

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { HttpClientModule } from '@angular/common/http';
import { ThreeDViewerComponent } from './path/to/three-d-viewer.component';

@NgModule({
  declarations: [
    AppComponent,
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    ThreeDViewerComponent, // <- changed here!
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Или вы можете импортировать его в общий модуль, но вам также необходимо его экспортировать, чтобы он был виден во всех компонентах, которые импортируют SharedModule!

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ThreeDViewerComponent } from './path/to/three-d-viewer.component';

@NgModule({
  declarations: [],
  imports: [CommonModule, ThreeDViewerComponent], // <- changed here!
  exports: [ThreeDViewerComponent]
})
export class SharedModule {}

Вы получили ошибку для массива imports, потому что в автономном компоненте существует только массив imports, а в неавтономном компоненте нет массива импорта в объекте декоратора компонента!

Я понимаю. Это должно быть в импорте, а не в декларациях. Спасибо!

Haidepzai 02.05.2024 10:36

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

Как имитировать вызов метода location.back() в Jest для тестирования компонентов Angular?
<mat-toolbar> меняет высоту всей страницы
Firebase Firestore блокирует стабильность приложения Angular, тем самым блокируя гидратацию в ssr
Я использую последний метод AuthGuard, он должен перенаправляться с помощью router.createUrlTree, если пользователь не вошел в систему, но он не может этого сделать
Обновление до Angular 17 — ошибка: node_modules/@types/node/globals.d.ts:72:13 — ошибка TS2403: последующие объявления переменных должны иметь тот же тип
Что было бы жизнеспособной и более гибкой альтернативой использованию моментальных снимков в Angular 16?
Как добавить условие if в другое условие if
Как они удалили элемент-обертку компонента Angular в Clarity
Невозможно найти элемент управления с ошибкой пути после перехода на Angular 15
Обновление до ionic 8 и автономного контроллера оповещения об ошибках компонентов