Компонент является частью объявления 2 модулей

Я пытаюсь создать приложение ionic 2. Когда я пробую приложение в браузере с помощью ionic serve или запускаю его на эмуляторе, все работает нормально.

Но когда я пытаюсь его построить, каждый раз появляется ошибка

ionic-app-script tast: "build"
Error Type AddEvent in "PATH"/add.event.ts is part of the declarations of 2 modules: AppModule in "PATH"/app.modules.ts and AddEvent in "PATH"/add-event.module.ts.
Please consider moving AddEvent in "PATH"/add-event.ts to a higher module that imports AppModule in "PATH"/app.module.ts and AddEventModule.
You can also create a new NgModule that exports and includes AddEvent then import that NgModule in AppModule and AddEventModule

мой AppModule

import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { AngularFireModule } from 'angularfire2';
import { MyApp } from './app.component';
import { Eventdata } from '../providers/eventdata';
import { AuthProvider } from '../providers/auth-provider';
import { HttpModule } from '@angular/http';

import { HomePage } from '../pages/home/home';
import { Login } from '../pages/login/login';
import { Register } from '../pages/register/register';
import { AddEvent } from '../pages/add-event/add-event';
import { EventDetails } from '../pages/event-details/event-details';

import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
   

@NgModule({
  declarations: [
    MyApp,
    HomePage,
    Login,
    Register,
    AddEvent,
    EventDetails
    
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HttpModule,
    AngularFireModule.initializeApp(config)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage,
    Login,
    Register,
    AddEvent,
    EventDetails
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler}, Eventdata, AuthProvider
  ]
})
export class AppModule {}

и мой add-event.module.ts

import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { AddEvent } from './add-event';

@NgModule({
  declarations: [
    AddEvent,
  ],
  imports: [
    IonicPageModule.forChild(AddEvent),
  ],
  exports: [
    AddEvent
  ]
})
export class AddEventModule {}

Я понимаю, что мне нужно удалить одно из объявлений, но не знаю как.

Если я удалю объявление из AppModule, я получаю сообщение об ошибке, что страница входа не найдена во время работы ionic serve.


person Stevetro    schedule 24.04.2017    source источник


Ответы (16)


Удалите объявление из AppModule, но обновите конфигурацию AppModule, чтобы импортировать ваш AddEventModule.

.....
import { AddEventModule } from './add-event.module';  // <-- don't forget to import the AddEventModule class

@NgModule({
  declarations: [
    MyApp,
    HomePage,
    Login,
    Register,
    //AddEvent,  <--- remove this
    EventDetails

  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HttpModule,
    AngularFireModule.initializeApp(config),
    AddEventModule,  // <--- add this import here
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage,
    Login,
    Register,
    AddEvent,
    EventDetails
  ],
  providers: [
    StatusBar,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler}, Eventdata, AuthProvider
  ]
})
export class AppModule {}

Также,

Обратите внимание: важно, чтобы ваш AddEventModule экспортировал компонент AddEvent, если вы хотите использовать его вне этого модуля. К счастью, вы уже настроили это, но если бы он был опущен, вы бы получили сообщение об ошибке, если бы попытались использовать компонент AddEvent в другом компоненте вашего AppModule

person snorkpete    schedule 24.04.2017
comment
привет, спасибо за ответ, мне также нужно изменить свой импорт на {AddEventModule} из '../pages/add-event/add-event.module' ;? Поскольку как с импортом, так и без него выдается ошибка - person Stevetro; 25.04.2017
comment
в AppModule необходимо включить дополнительный импорт для AddEventModule. Я обновлю ответ - person snorkpete; 25.04.2017
comment
Если я добавлю все, возникнет ошибка Ошибка при статическом разрешении значений символов. Не удалось разрешить add-event.module относительно символа разрешения AddModule. - person Stevetro; 25.04.2017
comment
в какой папке находится файл add-event.module.ts? - person snorkpete; 25.04.2017
comment
В той же папке, что и AddEvents, поэтому я использовал "../pages/add-event/add-event.module"; страница была сгенерирована страницей ionic g - person Stevetro; 25.04.2017
comment
ну, ваш импорт AddEventModule должен использовать правильный путь относительно местоположения AppModule. Если вы укажете, какова ваша структура папок (в частности, структура папок для папок, содержащих AppModule и AddEventModule, вы, вероятно, сможете узнать, что это за относительный путь - person snorkpete; 25.04.2017
comment
Таким образом, add-events.module.ts находится в той же папке, что и add-event.ts, а путь к нему - '../pages/add-event/add-event', поэтому все должно быть правильно - person Stevetro; 25.04.2017
comment
помните, что вы пытаетесь получить доступ к add-event.module из app.module - поэтому вам нужно построить путь к add-event.module.ts, начиная с app.module.ts < / я> - person snorkpete; 25.04.2017
comment
Хорошо, я действительно не знаю, почему вчера он не работал, но сегодня я сделал то же самое, и теперь ошибка отображается x). спасибо за помощь - person Stevetro; 25.04.2017
comment
ваш компьютер пытался сказать вам, что на сегодня достаточно! - person snorkpete; 25.04.2017
comment
Неожиданная директива «About in /root/Desktop/ionic_apps/shop/src/pages/about/about.ts», импортированная модулем «AppModule в /root/Desktop/ionic_apps/shop/src/app/app.module.ts» . Добавьте аннотацию @NgModule. эта ошибка возникла, когда я попытался реализовать тот же код для модуля «О программе». - person OshoParth; 31.07.2017
comment
Я удаляю файл pagename.module.ts со всех страниц и комментирую // @ IonicPage () на каждой странице page.ts, это нормально? - person user2828442; 27.12.2017
comment
Компонент AddEvent находится в entryComponents, он нужен здесь или мы можем удалить его оттуда? - person Venkat; 22.02.2019
comment
@Venkat, что касается исходного вопроса, компонент AddEvent, находящийся в entryComponents, не имеет значения. Необходимость наличия компонента AddEvent в entryComponents зависит от того, как вы используете AddEvent. Если вы используете компонент AddEvent исключительно путем добавления его тега / селектора в шаблон другого компонента, то нет, он вам не понадобится в entryComponents. Но если вы не используете селектор AddEvent где-либо в коде шаблона других компонентов, то компилятор Angular не имеет возможности узнать о существовании компонента AddEvent, поэтому вам нужно добавить его в entryComponents. - person snorkpete; 24.02.2019
comment
спасибо, что сработало. Я думаю, что таким образом мы сможем получить доступ ко всем компонентам, которые были объявлены в этом модуле, верно? - person Hossein Mousavi; 14.04.2020

Некоторые люди, использующие Lazy loading, могут наткнуться на эту страницу.

Вот что я сделал, чтобы исправить совместное использование директивы.

  1. создать новый общий модуль

shared.module.ts

import { NgModule, Directive,OnInit, EventEmitter, Output, OnDestroy, Input,ElementRef,Renderer } from '@angular/core';
import { CommonModule } from '@angular/common';

import { SortDirective } from './sort-directive';

@NgModule({
  imports: [
  ],
  declarations: [
  SortDirective
  ],
  exports: [
    SortDirective
  ]
})

export class SharedModule { }

Затем в app.module и других ваших модулях

import {SharedModule} from '../directives/shared.module'
...

@NgModule({
   imports: [
       SharedModule
       ....
       ....
 ]
})
export class WhateverModule { }
person Tom Stickel    schedule 20.05.2018
comment
почему бы не добавить его прямо в app.module? Или, может быть, в core.module, если вы собираетесь импортировать его из app.module - person Dani; 09.11.2018
comment
Это потрясающе! У меня есть одно дополнение к нему ... Вам нужно будет добавить IonicPageModule.forChild (SharedModule) в Импорт ShareModule. Пока я не сделал этого, у меня были разные странные проблемы. - person Adway Lele; 07.01.2019

Решение очень простое. Найдите *.module.ts файлы и комментарии к объявлениям. В вашем случае найдите addevent.module.ts файл и удалите / прокомментируйте одну строку ниже:

@NgModule({
  declarations: [
    // AddEvent, <-- Comment or Remove This Line
  ],
  imports: [
    IonicPageModule.forChild(AddEvent),
  ],
})

Это решение работало в ionic 3 для страниц, созданных с помощью ionic-cli, и работает как в ionic serve, так и в ionic cordova build android --prod --release командах!

Будь счастлив...

person EmRa228    schedule 22.01.2018

IN Angular 4. Эта ошибка рассматривается как проблема с кешем времени выполнения ng serve.

case: 1 эта ошибка возникнет, если вы импортируете компонент в один модуль и снова произойдет импорт в подмодулях.

case: 2 Импортируйте один компонент в неправильное место и удалите и замените его в правильном модуле. На этот раз он считает проблему с кешем ng serve. Необходимо Остановить проект и запустить -do again ng serve, он будет работать должным образом.

person gnganapath    schedule 13.11.2017
comment
Случай 1 был проблемой в моем случае, РЕШЕН! - person Prem popatia; 11.09.2018

Если ваши страницы созданы с помощью интерфейса командной строки, тогда он создает файл с filename.module.ts, тогда вам необходимо зарегистрировать свой filename.module.ts в массиве импорта в приложении. module.ts и не вставляйте эту страницу в массив объявлений.

eg.

import { LoginPageModule } from '../login/login.module';


declarations: [
    MyApp,
    LoginPageModule,// remove this and add it below array i.e. imports
],

imports: [
        BrowserModule,
        HttpModule,
        IonicModule.forRoot(MyApp, {
           scrollPadding: false,
           scrollAssist: true,
           autoFocusAssist: false,
           tabsHideOnSubPages:false
        }),
       LoginPageModule,
],
person Sandeep    schedule 23.03.2018

Этот модуль добавляется автоматически при запуске команды ionic. Однако это не обязательно. Таким образом, альтернативным решением является удаление add-event.module.ts из проекта.

person Jaime Yule    schedule 17.10.2017

Вы можете просто попробовать это решение (для Ionic 3)

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

 this.navCtrl.push("Login"); // Bug

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

this.navCtrl.push (Вход); // Верный

Я не могу объяснить разницу в настоящее время, так как я разработчик начального уровня

person sijo vijayan    schedule 20.11.2017
comment
Вы перестали использовать ленивую загрузку, мой друг, это важно в Google. - person George; 23.01.2018

Начиная с версии Ionic 3.6.0 Release каждая страница, созданная с помощью Ionic-CLI, теперь является модулем Angular. Это означает, что вы должны добавить модуль к импортируемым файлам в файле src/app/app.module.ts

import { BrowserModule } from "@angular/platform-browser";
import { ErrorHandler, NgModule } from "@angular/core";
import { IonicApp, IonicErrorHandler, IonicModule } from "ionic-angular";
import { SplashScreen } from "@ionic-native/splash-screen";
import { StatusBar } from "@ionic-native/status-bar";;

import { MyApp } from "./app.component";
import { HomePage } from "../pages/home/home"; // import the page
import {HomePageModule} from "../pages/home/home.module"; // import the module

@NgModule({
  declarations: [
    MyApp,
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    HomePageModule // declare the module
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    HomePage, // declare the page
  ],
  providers: [
    StatusBar,
    SplashScreen,
    { provide: ErrorHandler, useClass: IonicErrorHandler },
  ]
})
export class AppModule {}
person 0x1ad2    schedule 16.02.2018

Чтобы обойти эту ошибку, вы должны начать с удаления всего импорта app.module.ts и получить что-то вроде этого:

            import { BrowserModule } from '@angular/platform-browser';
            import { HttpClientModule } from '@angular/common/http';
            import { ErrorHandler, NgModule } from '@angular/core';
            import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
            import { SplashScreen } from '@ionic-native/splash-screen';
            import { StatusBar } from '@ionic-native/status-bar';

            import { MyApp } from './app.component';


            @NgModule({
              declarations: [
                MyApp
              ],
              imports: [
                BrowserModule,
                HttpClientModule,
                IonicModule.forRoot(MyApp)
              ],
              bootstrap: [IonicApp],
              entryComponents: [
                MyApp
              ],
              providers: [
                StatusBar,
                SplashScreen,
                {provide: ErrorHandler, useClass: IonicErrorHandler}
              ]
            })
            export class AppModule {}

Затем отредактируйте модуль страниц, например:

            import { NgModule } from '@angular/core';
            import { IonicPageModule } from 'ionic-angular';
            import { HomePage } from './home';

            @NgModule({
              declarations: [
                HomePage,
              ],
              imports: [
                IonicPageModule.forChild(HomePage),
              ],
              entryComponents: [HomePage]
            })
            export class HomePageModule {}

Затем добавьте аннотацию IonicPage перед компонентной аннотацией всех страниц:

import { IonicPage } from 'ionic-angular';

@IonicPage()
@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})

Затем отредактируйте свой тип rootPage, чтобы он был строковым, и удалите импорт страниц (если он есть в вашем компоненте приложения)

rootPage: string = 'HomePage';

Тогда функция навигации должна быть такой:

 /**
* Allow navigation to the HomePage for creating a new entry
*
* @public
* @method viewHome
* @return {None}
*/
 viewHome() : void
 {
  this.navCtrl.push('HomePage');
 }

Вы можете найти источник этого решения здесь: Компонент является частью объявления 2 модулей

person Ouahib Abdallah    schedule 06.03.2018

Решено - компонент является частью объявления двух модулей

  1. Удалить файл pagename.module.ts в приложении
  2. Удалите import {IonicApp} из 'ionic-angular'; в файле pagename.ts
  3. Удалите @IonicPage () из файла pagename.ts

И запустите команду ionic cordova build android --prod --release. Она работает в моем приложении.

person Divya    schedule 16.08.2018

Была такая же проблема. Просто убедитесь, что вы удалили все вхождения модуля в «объявлениях», кроме AppModule.

Работал у меня.

person David Vareka    schedule 23.08.2018

Простое исправление,

Перейдите в свой app.module.ts файл и remove/comment все, что связывается с add_event. Нет необходимости добавлять компоненты к App.module.t, которые генерируются ionic cli, потому что он создает отдельный модуль для компонентов с именем components.module.ts.

Он имеет необходимый импорт компонентов модуля

person Kavinda Jayakody    schedule 03.05.2018

Поскольку ошибка говорит об удалении модуля AddEvent из корня, если ваша страница / компонент уже имеет файл ионного модуля, если не просто удалить его с другой / дочерней страницы / компонента, на конечной странице / компоненте должен присутствовать только один файл модуля импортированный, если будет использоваться.

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

person Kuldeep Kumar    schedule 07.09.2018

Я случайно создал свой собственный компонент с тем же именем, что и компонент библиотеки.

Когда я использовал свою IDE для автоматического импорта библиотеки для компонента, я выбрал не ту библиотеку.

Поэтому эта ошибка жаловалась, что я повторно объявлял компонент.

Я исправил, импортировав из собственного кода компонента, а не из библиотеки.

Я мог бы также исправить это, назвав по-другому: избегайте двусмысленности.

person The Red Pea    schedule 12.05.2019

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

В общем компоненте. объявить эти компоненты. А затем импортируйте общий модуль в appmodule, а также в другой модуль, к которому вы хотите получить доступ. Он будет работать на 100%, я сделал это, и он заработал.

@NgModule({
    declarations: [HeaderComponent, NavigatorComponent],
    imports: [
        CommonModule, BrowserModule,
        AppRoutingModule,
        BrowserAnimationsModule,
        FormsModule,
    ] 
})
export class SharedmoduleModule { }
const routes: Routes = [
{
    path: 'Parent-child-relationship',
    children: [
         { path: '', component: HeaderComponent },
         { path: '', component: ParrentChildComponent }
    ]
}];
@NgModule({
    declarations: [ParrentChildComponent, HeaderComponent],
    imports: [ RouterModule.forRoot(routes), CommonModule, SharedmoduleModule ],
    exports: [RouterModule]
})
export class TutorialModule {
}
imports: [
    BrowserModule,
    AppRoutingModule,
    BrowserAnimationsModule,
    FormsModule,
    MatInputModule,
    MatButtonModule,
    MatSelectModule,
    MatIconModule,
    SharedmoduleModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
person Sarad Vishwakama    schedule 31.08.2019
comment
этот код был протестирован в angular и отлично работает - person Sarad Vishwakama; 31.08.2019

У меня была такая же ошибка, но я обнаружил, что когда вы импортируете AddEventModule, вы не можете импортировать модуль AddEvent, так как в этом случае он представит ошибку.

person user8470307    schedule 16.08.2017