Ionic 4 (Angular 7) - проблема совместного использования компонентов

Я пытаюсь сделать крайне обычную вещь для такого фреймворка, как Angular. Цель состоит в том, чтобы использовать один и тот же (HeaderComponent) компонент более одного раза через общий модуль.

Мой shared.module.ts:

import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { HeaderComponent } from '../header/header.component';
import { IonicModule} from '@ionic/angular';

@NgModule({
    imports: [
        CommonModule, 
        IonicModule
    ],
    declarations: [
        HeaderComponent
    ],
    exports: [
        HeaderComponent
    ]
})

export class SharedModule {}

В app.module.ts я добавил это:

imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule, SharedModule],

И в home.page.html я попытался отобразить это так:

<app-header></app-header>

Это действительно сработало, поскольку браузер показывал мне такие ошибки, как

'ion-col' is not a known element

и так далее для всех ионных компонентов из HeaderComponent.

Я нашел решение проблемы в Интернете, предлагающее добавить IonicModule.forRoot(HeaderComponent) в массив импортshared.module.ts, но этот подход вызывает следующую ошибку:

'app-header' is not a known element

Как будто его больше нет в наличии.

выдергиваю волосы с помощью Ionic 4. Как использовать общие компоненты в Ionic 4 .... !!!!!

deanwilliammills 11.09.2019 13:56
Тестирование функциональных 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
10
1
4 130
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

вы дополнительно должны добавить ионный модуль к вашему общему модулю следующим образом:

import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { HeaderComponent } from '../header/header.component';
import { IonicModule } from 'ionic-angular';

@NgModule({
  imports: [
    CommonModule,
    IonicModule
  ],
  declarations: [
    HeaderComponent
  ],
  exports: [
    HeaderComponent
  ]
})

export class SharedModule {}

если вы используете ionic 4, вам нужно отредактировать импорт IonicModule следующим образом:

import { IonicModule } from '@ionic/angular';

IonicModule добавляется на корневом уровне, поэтому нет необходимости

Sajeetharan 27.10.2018 16:14

Ты не прав. Если вы генерируете общий компонентный модуль с помощью ionic, модуль по умолчанию импортирует ионный модуль. Если то, что вы говорите, правда, зачем вам импортировать commonmodule, даже если вы импортируете модуль браузера в корневой каталог?

Gary Großgarten 27.10.2018 16:20

да имеет смысл :)

Sajeetharan 27.10.2018 16:22

в конце концов понял это

deanwilliammills 04.11.2019 09:41

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

У меня было много проблем с попыткой создать третий, то есть общий модуль, поэтому я нашел это очень полезным: https://forum.ionicframework.com/t/ionic-4-create-shared-component-up-to-date-example-please/176887

Я не следил за тем, как избавляться от вещей, но я добавил модуль в свой компонент (в той же папке). Затем на других страницах я смог импортировать этот модуль поверх, а затем в массив импорта, и это сработало.

В конце концов мне пришлось импортировать другие вещи, подобные тому, что сказал Гэри выше, но это просто здравый смысл.

В большинстве руководств, которые я нашел в Интернете, вы должны создать еще один компонент, а затем использовать модуль, который поставляется с ним. Я был очень сбит с толку, следуя такому образу мышления. Я думаю, что в основном это сводится к тому, что вы можете делиться модулями, но не компонентами. Не цитируйте меня, но я так понимаю сейчас.

header.component.html

     <ion-header>
...

    </ion-header>

header.component.ts

import { Component, OnInit, Input } from '@angular/core';
import { feedService } from "../services/feed.service";

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss'],
})
export class HeaderComponent implements OnInit {
 ...
  constructor() {}

  ngOnInit() {}
}

header.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { IonicModule } from '@ionic/angular';
import { HeaderComponent } from "./header.component";

@NgModule({
    imports: [
      ...  
    ],
    declarations: [HeaderComponent],
    exports: [HeaderComponent],
  })
  export class HeaderModule{
  }

наконец, чтобы использовать его в другом месте, на странице module.ts

import ... //other modules

import { HeaderModule  } from "../header/header.module";  //your relative path

@NgModule({
  imports: [
    //other modules
    HeaderModule,
  ],
  declarations: [],
  entryComponents: [],
})
export class MyPageModule {}

затем в html-файле этой страницы я могу использовать селектор, объявленный в header.component.ts выше.

<app-header ...></app-header>

Пожалуйста, укажите в своем ответе дополнительную информацию. Как сейчас написано, ваше решение сложно понять.

Community 02.09.2021 19:40

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