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

119

Я пытаюсь создать приложение 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 creat 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

Stevetro
источник

Ответы:

193

Удалите декларацию из 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

snorkpete
источник
привет, спасибо за ответ, мне нужно также изменить мой импорт на {AddEventModule} из '../pages/add-event/add-event.module' ;? Потому что и с импортом, и без него
выдается
в AppModule необходимо включить дополнительный импорт для AddEventModule.
Обновлю
Если я добавлю все, выдается ошибка «Произошла ошибка при статическом разрешении значений символов. Не удалось разрешить add-event.module относительно разрешения символа AddModule»
Стиветро
1
в какой папке находится файл add-event.module.ts?
snorkpete
В той же папке, что и AddEvents, поэтому я использовал "../pages/add-event/add-event.module"; страница была создана ionic g page
Stevetro
48

Некоторые люди, использующие, 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 { }
Том Стикель
источник
почему бы не добавить его прямо в app.module? Или, может быть, в core.module, если вы собираетесь импортировать его из app.module
Дэни
6
Это потрясающе! У меня есть одно дополнение к нему ... Вам нужно будет добавить IonicPageModule.forChild (SharedModule) в Импорт ShareModule. Пока я этого не сделал, у меня возникали разные странные проблемы.
Adway Lele
17

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

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

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

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

EmRa228
источник
5

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

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

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

gnganpath
источник
Случай 1 был проблемой в моем случае, РЕШЕН!
Prem popatia
5

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

например.

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,
],
Sandeep
источник
1

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

Хайме Юл
источник
1

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

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

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

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

this.navCtrl.push (Войти); // Верный

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

Сиджо Виджаян
источник
5
Вы перестали использовать ленивую загрузку, мой друг, погуглите, это важно
Джордж
1

Начиная с выпуска Ionic 3.6.0 каждая страница, созданная с использованием 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 {}
0x1ad2
источник
1

Чтобы обойти эту ошибку, вы должны начать с удаления всего импорта 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 модулей

Уахиб Абдаллах
источник
1

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

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

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

Дивья
источник
1

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

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

Дэвид Варека
источник
0

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

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

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

Кавинда Джаякоди
источник
0

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

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

Кулдип Кумар
источник
0

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

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

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

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

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

Красный горошек
источник
0

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

В общем компоненте. объявить эти компоненты. А затем импортируйте общий модуль в 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 { }
Сарад Вишвакама
источник
этот код был протестирован в angular и отлично работает
Сарад Вишвакама
-3

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

user8470307
источник