Angular 4: không tìm thấy nhà máy sản xuất thành phần nào, bạn đã thêm nó vào @ NgModule.entryComponents chưa?


300

Tôi đang sử dụng mẫu Angular 4 với webpack và tôi gặp lỗi này khi tôi cố gắng sử dụng một thành phần (ConfirmComponent):

Không tìm thấy nhà máy thành phần nào cho ConfirmComponent. Bạn đã thêm nó vào @ NgModule.entryComponents?

Thành phần được khai báo trong app.module.server.ts

@NgModule({
  bootstrap: [ AppComponent ],
  imports: [
    // ...
  ],
  entryComponents: [
    ConfirmComponent,
  ],
})
export class AppModule { }

Tôi cũng có app.module.browser.tsapp.module.shared.ts

Lam sao tôi co thể sửa no?


1
Làm thế nào bạn sử dụng ConfirmComponentcác chi tiết không đủ để trả lời câu hỏi của bạn
Anik

Xin chào. Tôi đang sử dụng nó sau khi nhập vào thành phần nhập khẩu {ConfirmComponent} của tôi từ "../confirm.component/confirm.component";
mrapi


Nếu nó sẽ hoạt động như một thành phần phổ biến, bạn có thể đặt nó vào các khai báo và entryComponents của CommonModule và xóa khỏi các vị trí khác.
Charitha Goonewardena

1
Đối với hộp thoại góc cùng lỗi và sửa! freakyjolly.com/ Kẻ
Spy Spy

Câu trả lời:


437

Thêm cái này vào module.ts,

declarations: [
  AppComponent,
  ConfirmComponent
]

nếu ConfirmComponent nằm trong một mô-đun khác, bạn cần xuất nó ở đó để bạn có thể sử dụng nó bên ngoài, thêm:

exports: [ ConfirmComponent ]

--- Cập nhật Angular 9 hoặc Angular 8 với Ivy được kích hoạt rõ ràng ---

Các thành phần nhập cảnh với Ivy không còn cần thiết nữa và hiện không được chấp nhận

--- cho Angular 9 và 8 với Ivy bị vô hiệu hóa ---

Trong trường hợp thành phần được tải động và để tạo ra một phần tử linh hoạt, thành phần này cũng phải được thêm vào entryComponents của mô-đun:

declarations: [
  AppComponent,
  ConfirmComponent
],
entryComponents: [ConfirmComponent],

theo định nghĩa của entryComponents

Chỉ định danh sách các thành phần sẽ được biên dịch khi mô-đun này được xác định. Đối với mỗi thành phần được liệt kê ở đây, Angular sẽ tạo ra một ElementFactory và lưu trữ nó trong ElementFactoryResolver.


2
Hi.it đã có trong app.module. Shared.ts và entryComponents nằm trong app.module.server.ts
mrapi

3
nếu ConfirmComponent nằm trong một mô-đun khác, bạn cần xuất nó ở đó để bạn có thể sử dụng nó bên ngoài, thêm: export: [ConfirmComponent] trong app.module. Shared.ts
Fateh Mohamed

1
nó là thành phần ng2-bootstrap-modal từ github.com/ankosoftware/ng2-bootstrap-modal/blob/master/
phỏng

9
Cảm ơn tất cả các bạn. !!!!!!! .. đặt tất cả các khai báo và entryComponents vào cùng một tệp app.module. Shared.ts đã khắc phục sự cố
mrapi

9
xuất khẩu không hoạt động ... tùy chọn entryComponents làm việc cho tôi!.
Raja Rama Mohan Thavalam

132

Xem chi tiết về entryComponent:

Nếu bạn đang tải bất kỳ thành phần nào một cách linh hoạt thì bạn cần đặt nó vào cả hai declarationsentryComponent:

@NgModule({
  imports: [...],
  exports: [...],
  entryComponents: [ConfirmComponent,..],
  declarations: [ConfirmComponent,...],
  providers: [...]
})

5
Cảm ơn, ý tôi là, CẢM ƠN !!! Tôi đang tạo một hộp thoại để nhập dữ liệu bên trong một thành phần khác (Hộp thoại có khai báo thành phần bên trong thành phần khác và hộp thoại.html cho bố cục)
Ramon Araujo

3
Điều này đã lừa tôi và cũng có một lời giải thích tốt hơn câu trả lời được chọn. Cảm ơn bạn!
Asen Simonean

2
Rõ ràng câu trả lời tốt nhất cho tôi!
tuxy42

Đây là giải pháp cho tôi; Tôi đã tạo ra một thành phần một cách nhanh chóng và có mọi thứ trong các mô-đun chính xác nhưng vẫn gặp lỗi. Thêm các thành phần được tạo của tôi entryComponentslà giải pháp - cảm ơn bạn!
Novastorm

2
thành phần của tôi gọi ModalComponent là cháu của một thành phần. Không thêm ModalComponent vào entryComponentscũng không thêm nó để exportslàm việc cho tôi. NHƯNG tôi có thể gọi ModalComponent từ một số thành phần khác không phải là cháu
canbax

54

TL; DR: Một dịch vụ trong ng6 với providedIn: "root"không thể tìm thấy ComponentFactory khi phần không được thêm vào trong entryComponentscủa app.module .

Vấn đề này cũng có thể xảy ra nếu bạn đang sử dụng góc 6 kết hợp với việc tạo động một Thành phần trong dịch vụ!

Ví dụ: tạo Lớp phủ:

@Injectable({
  providedIn: "root"
})
export class OverlayService {

  constructor(private _overlay: Overlay) {}

  openOverlay() {
    const overlayRef = this._createOverlay();
    const portal = new ComponentPortal(OverlayExampleComponent);

    overlayRef.attach(portal).instance;
  }
}

Vấn đề là

cung cấp trong: "root"

định nghĩa, cung cấp dịch vụ này trong app.module .

Vì vậy, nếu dịch vụ của bạn được đặt tại, ví dụ: "OverlayModule", nơi bạn cũng đã khai báo OverlayExampleComponent và thêm nó vào entryComponents, dịch vụ không thể tìm thấy PartFactory cho OverlayExampleComponent.


3
Sự cố cụ thể đối với Angular 6. Khắc phục sự cố bằng cách thêm thành phần của bạn vào entryComponents trong @NgModule @NgModule ({entryComponents: [yourComponentName]})
DeanB_Develop

6
Điều này có thể được khắc phục bằng cách loại bỏ providedInvà thay vào đó bằng cách sử dụng providerstùy chọn trên mô-đun.
Knelis

Cảm ơn thông tin, nhưng nó đã thêm vào @NgModule ({..., entryComponents: [...]}) đã làm việc cho tôi ngay cả với được cung cấp: "root"
Mykola Mykolayovich Dolynskyi

1
điều này dường như có liên quan đến github.com/angular/angular/issues/14324 dường như sẽ được giải quyết trong Angular 9
Paolo Sanchi

Chính xác, đặc biệt là trong mô-đun tải lười biếng. Để khắc phục điều này, tôi đã chỉ định NgModule.providers: [MyLazyLoadedModuleService] và thay đổi MyLazyLoadedModuleService.providedIn từ "root" thành MyLazyLoadedmodule.
Howard

45

Tôi gặp vấn đề tương tự. Trong trường hợp imports [...]này là rất quan trọng, vì nó sẽ không hoạt động nếu bạn không nhập NgbModalModule.

Mô tả lỗi nói rằng các thành phần nên được thêm vào entryComponentsmảng và điều đó là hiển nhiên, nhưng hãy chắc chắn rằng bạn đã thêm cái này vào vị trí đầu tiên:

imports: [
    ...
    NgbModalModule,
    ...
  ],

6
Bạn đã cứu tôi, chúc mừng! Điều này chắc chắn là cần thiết khi bạn cố gắng mở thành phần trong một phương thức. Thông báo lỗi là một chút sai lệch trong tình huống này.
beawolf

Bạn nhập nó từ đâu?
Mdomin45

Trong trường hợp của tôi, tôi đã thay đổi nhập NbDialogModule thành NbDialogModule.forChild (null),
Maaya Hope

@ Mdomin45 nhập {NgbModalModule} từ '@ ng-bootstrap / ng-bootstrap';
mpatel

24

Thêm thành phần đó vào entryComponents trong @NgModule của mô-đun ứng dụng của bạn:

entryComponents:[ConfirmComponent],

cũng như các Tuyên bố:

declarations: [
    AppComponent,
    ConfirmComponent
]

Cứu ngày của tôi! Chúc mừng người bạn đời
Sahan Serasinghe

thành phần của tôi gọi ModalComponent là cháu của một thành phần. Không thêm ModalComponent vào entryComponentscũng không thêm nó để exportslàm việc cho tôi. NHƯNG tôi có thể gọi ModalComponent từ một số thành phần khác không phải là cháu
canbax

14

Thêm 'NgbModalModule' trong nhập khẩu và tên thành phần của bạn trong entryComponents App.module.ts như hiển thị bên dưới nhập mô tả hình ảnh ở đây


thành phần của tôi gọi ModalComponent là cháu của một thành phần. Không thêm ModalComponent vào entryComponentscũng không thêm nó để exportslàm việc cho tôi. NHƯNG tôi có thể gọi ModalComponent từ một số thành phần khác không phải là cháu
canbax

Tôi cần phải lặp lại câu trả lời này, nếu thành phần của bạn đã được thêm vào entryComponents và bạn vẫn gặp sự cố, hãy đảm bảo kiểm tra modalComponent bạn đang sử dụng và thêm nó vào mảng nhập khẩu! Điều này đã cứu cuộc đời tôi!
Clyde

10

Đặt các thành phần được tạo động vào entryComponents dưới hàm @NgModiatedecorator.

@NgModule({
    imports: [
        FormsModule,
        CommonModule,
        DashbaordRoutingModule
    ],
    declarations: [
        MainComponent,
        TestDialog
    ],
    entryComponents: [
        TestDialog
    ]
})

1
Có, điều này rất hữu ích - nếu bạn nói một hộp thoại không được chọn bởi một tuyến đường nhưng được sử dụng động, thì nó cần phải được thêm vào entryComponentsmô-đun ng tương ứng mà nó đã khai báo.
atconway

thành phần của tôi gọi ModalComponent là cháu của một thành phần. Không thêm ModalComponent vào entryComponentscũng không thêm nó để exportslàm việc cho tôi. NHƯNG tôi có thể gọi ModalComponent từ một số thành phần khác không phải là cháu
canbax

10

Tôi có cùng một vấn đề với góc 6, đó là những gì làm việc cho tôi:

@NgModule({
...
entryComponents: [ConfirmComponent],
providers:[ConfirmService]

})

Nếu bạn có một dịch vụ như ConfirmService , phải được khai báo trong các nhà cung cấp mô-đun hiện tại thay vì root


8

Tôi đã có cùng một vấn đề cho phương thức bootstrap

nhập {NgbModal} từ '@ ng-bootstrap / ng-bootstrap';

Nếu đây là trường hợp của bạn, chỉ cần thêm thành phần vào khai báo mô-đun và entryComponents như các phản hồi khác đề xuất, nhưng cũng thêm điều này vào mô-đun của bạn

nhập {NgbModule} từ '@ ng-bootstrap / ng-bootstrap';

imports: [
   NgbModule.forRoot(),
   ...
]

8

Lỗi này xảy ra khi bạn cố gắng tải một thành phần động và:

  1. Thành phần bạn muốn tải không phải là mô đun định tuyến
  2. Thành phần này không có trong entryComponents mô-đun.

trong định tuyến

const routes: Routes = [{ path: 'confirm-component', component: ConfirmComponent,data: {}}]

hoặc trong mô-đun

entryComponents: [
ConfirmComponent
} 

Để khắc phục lỗi này, bạn có thể thêm bộ định tuyến vào thành phần hoặc thêm nó vào entryComponents của mô-đun.

  1. Thêm một bộ định tuyến vào thành phần.drawback của phương pháp này là thành phần của bạn sẽ có thể truy cập được bằng url đó.
  2. Thêm nó vào entryComponents. trong trường hợp này, thành phần của bạn sẽ không có bất kỳ url nào được đính kèm và nó sẽ không thể truy cập được bằng url.

8

Tôi gặp vấn đề tương tự ở Angular7 khi tôi tạo các thành phần động. Có hai thành phần (TreatListComponent, MyTreatComponent) cần được tải động. Tôi vừa thêm mảng entryComponents vào tệp app.module.ts của mình.

    entryComponents: [
    TreatListComponent,
    MyTreatComponent
  ],

6

nếu bạn sử dụng định tuyến trong ứng dụng của bạn

đảm bảo Thêm các thành phần mới vào đường dẫn định tuyến

ví dụ :

    const appRoutes: Routes = [
  { path: '', component: LoginComponent },
  { path: 'home', component: HomeComponent },
  { path: 'fundList',      component: FundListComponent },
];

7
Không, tôi không nghĩ mọi thành phần nên nằm trong một lộ trình.
Mcanic

Chỉ các trang bạn muốn hiển thị phải ở trong các tuyến đường. Một trang có thể sử dụng / hiển thị nhiều thành phần
Thibaud Lacan

mỗi khi bạn không cần thêm thành phần vào Tuyến, chẳng hạn như phương thức. Đặt các thành phần được tạo động vào entryComponents dưới hàm @NgModiatedecorator.
CodeMind

3

Trong trường hợp của tôi, tôi hoàn toàn không cần entryComponents - chỉ cần thiết lập cơ bản như được mô tả trong liên kết bên dưới, nhưng tôi cần bao gồm nhập trong cả mô-đun ứng dụng chính và mô-đun kèm theo.

imports: [
    NgbModule.forRoot(),
    ...
]

https://medium.com/@sunilk/getting-started-angular-6-and-ng-bootstrap-4-4b314e015c1c

Bạn chỉ cần thêm nó vào entryComponents nếu một thành phần sẽ được đưa vào phương thức. Từ các tài liệu:

Bạn có thể vượt qua một thành phần hiện có dưới dạng nội dung của cửa sổ phương thức. Trong trường hợp này, hãy nhớ thêm thành phần nội dung dưới dạng phần entryComponents của NgModule.


error TS2339: Property 'forRoot' does not exist on type 'typeof NgbModule'.sử dụng góc 8
canbax

3

Tôi đã gặp vấn đề tương tự với lưới điện sử dụng các thành phần động. Tôi phát hiện ra bạn cần thêm thành phần động vào mô-đun ag-lưới .withComponents []

nhập khẩu: [StratoMaterialModule, BrowserModule, AppRoutingModule, HttpClientModule, BrowserAnimationsModule, NgbModule.forRoot (), FormsModule, ReactiveFormsModule, AppRoutingModule, AgGridModule.withComponents (ProjectUpdateButtonComponent) ],


3

Trong trường hợp của tôi, tôi đã quên thêm MatDialogModulevào nhập khẩu trong một mô-đun con.


2

Để làm rõ ở đây. Trong trường hợp bạn không sử dụng ComponentFactoryResolvertrực tiếp trong thành phần và bạn muốn trừu tượng hóa nó thành dịch vụ, sau đó được đưa vào thành phần bạn phải tải nó theo nhà cung cấp cho mô-đun đó, vì nếu lười tải thì nó sẽ không hoạt động.


2

Trong trường hợp bạn vẫn còn lỗi sau khi cung cấp lớp hộp thoại thành phần entryComponents, hãy thử khởi động lại ng serve- nó hoạt động với tôi.


2

Lỗi của tôi là gọi phương thức mở NgbModal với các tham số không chính xác từ .html


2

Bạn nên nhập NgbModuletrong mô-đun như thế này:

@NgModule({
  declarations: [
    AboutModalComponent
  ],
  imports: [
    CommonModule,
    SharedModule,
    RouterModule,
    FormsModule,
    ReactiveFormsModule,
    NgxLoadingModule,
    NgbDatepickerModule,
    NgbModule
  ],
  entryComponents: [AboutModalComponent]
})
 export class HomeModule {}


Hoàn hảo cho bro đó là ví dụ url - phứcantariqblog.wordpress.com/2017/02/12/ khăn
Juan Ignacio Liska

1
  1. entryComponentslà quan trọng. Trên đây câu trả lời là chính xác.

Nhưng...

  1. Nếu bạn đang cung cấp dịch vụ mở phương thức (một mẫu chung) và mô-đun xác định thành phần hộp thoại không được tải trong AppModule, bạn cần thay đổi providedIn: 'root'thành providedIn: MyModule. Theo thông lệ tốt, bạn chỉ nên sử dụng providedIn: SomeModulecho tất cả các dịch vụ hộp thoại trong các mô-đun.

0

Tôi đang sử dụng Angular8 và tôi đang cố gắng mở thành phần một cách linh hoạt một mô-đun khác , trong trường hợp này, bạn cần phải import the modulevào mô-đun đang cố gắng mở thành phần, tất nhiên ngoài export thành phần đó và liệt kê nó vào entryComponentsmảng như các câu trả lời trước đã làm.

imports: [
    ...
    TheModuleThatOwnTheTargetedComponent,
    ...
  ],

0

Trong trường hợp của tôi, tôi đã giải quyết vấn đề này bằng cách:
1) đặt NgxMaterialTimepickerModulevào app module imports:[ ]
2) đặt NgxMaterialTimepickerModulevào testmodule.ts imports:[ ]
3) đặt testcomponentvào declartions:[ ]entryComponents:[ ]

(Tôi đang sử dụng phiên bản 8+ góc cạnh)


-1

Khai báo tất cả các trang mới trong app.module

@NgModule({
  declarations: [
    MyApp,
    RegisterPage,
    OtpPage,
    LoginPage,
    ForgetPasswordPage,ChatlistPage,ChatPage,TabsPage

    // AboutPage,

    // BusinessDetailDescPage,
    // BusinessDescPage
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp),
    IonicStorageModule.forRoot(),
    HttpClientModule,
    NgxBarcodeModule
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
    RegisterPage,
    OtpPage,
    LoginPage,
    ForgetPasswordPage,ChatlistPage,ChatPage,TabsPage
    // AboutPage,

    // BusinessDetailDescPage,
    // BusinessDescPage
  ],

 - 


----------


---------

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.