组件是2个模块声明的一部分


117

我尝试构建一个ionic 2应用程序。当我在使用离子服务的浏览器中尝试该应用程序或在模拟器上启动该应用程序时,一切正常。

但是当我每次尝试构建它时都会出错

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中删除声明,则在运行离子服务时会得到一个错误,指出找不到登录页面

Answers:


192

从中删除声明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 {}

也,

请注意,如果要在该模块之外使用AddEventModuleAddEvent组件,则导出该组件很重要。幸运的是,您已经配置了该组件,但是如果省略了该AddEvent组件,则尝试在该组件的另一个组件中使用该组件时会出现错误。AppModule


嘿,谢谢您的回答,我是否还必须将导入从'../pages/add-event/add-event.module'更改为{AddEventModule}?因为无论是否导入,都将引发错误
Stevetro

在AppModule中,您必须为AddEventModule包括其他导入。我将更新答案
snorkpete

如果我添加所有内容,则会引发错误“错误:静态遇到符号解析错误。无法解析add-event.module相对于符号AddModule的解析”
Stevetro

1
“ add-event.module.ts”文件位于哪个文件夹?
snorkpete

在与AddEvents相同的文件夹中,所以我使用了''../pages/add-event/add-event.module'; 该页面是由离子g页面生成的
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?如果您要从app.module导入它,也可以导入core.module
Dani,

6
太棒了!我还有一个补充...您将需要将IonicPageModule.forChild(SharedModule)添加到ShareModule的Imports中。直到我做完所有奇怪的事情。
Adway Lele

17

解决方法很简单。查找*.module.ts文件和注释声明。在您的情况下,找到addevent.module.ts文件并删除/注释以下一行:

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

该解决方案在ionic 3中适用于ionic-cli生成的页面,并且可以在ionic serveionic cordova build android --prod --release命令中使用!

要开心...


5

在Angular 4中。此错误被视为ng服务运行时缓存问题。

案例1:一旦将组件导入一个模块,然后再次导入子模块,就会发生此错误。

情况:2在错误的位置导入一个组件,然后在“正确”模块中将其删除和更换,这时它被视为服务缓存问题。需要停止项目并重新开始服务,它将按预期工作。


案例1是我的问题,已解决!
Prem popatia

5

如果您的页面是使用CLI创建的,那么它将创建一个文件名为filename.module.ts的文件,那么您必须在app.module.ts文件的imports数组中注册filename.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,
],

1

运行ionic命令时会自动添加此模块。但是,这不是必需的。因此,另一种解决方案是从项目中删除add-event.module.ts


1

您可以尝试使用此解决方案(适用于Ionic 3)

就我而言,使用以下代码调用页面时会发生此错误

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

我只是删除了像下面这样的引号,并且还在我用来调用“登录”页面的文件顶部导入了该页面。

this.navCtrl.push(登录); //正确

由于我是初学者级开发人员,因此目前无法解释两者之间的区别


5
您停止使用lazyloading我的朋友Google了,它很重要
乔治,乔治,

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 {}

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. 从“ ionic-angular”中删除导入{IonicApp};在pagename.ts文件中
  3. 从pagename.ts文件中删除@IonicPage()

并运行命令ionic cordova build android --prod --release 在我的应用程序中工作



0

简单修复,

转到您的app.module.ts文件以及remove/comment与绑定的所有内容add_event。不需要向App.module.t由生成的s 添加组件,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 { }

此代码已经过角度测试并完美工作
Sarad Vishwakama,

-3

我遇到了同样的错误,但是我发现,当您导入时AddEventModule,您将无法导入AddEvent模块,因为在这种情况下会出现错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.