2016-08-03 1 views
24

С переходом на последних сборках Угловое 2 (т.е. на GitHub, мастер), я получаю предупреждения, как следует обо всех моих компонентов:Последние строит из Angular2 жалуются с: NgModule DynamicModule использует HomeComponent через «entryComponents»

NgModule DynamicModule использует HomeComponent через «entryComponents», но не был объявлен и не импортирован! Это предупреждение станет ошибкой после финала.

Я получаю то же сообщение об ошибке для всех моих компонентов, в дополнение к HomeComponent.

Может ли кто-нибудь указать информацию об этом?

+0

заведите [Minimal, Complete, и Проверяемость Пример] (http://stackoverflow.com/help/mcve) –

+0

выше предупреждение связано с неправильным использование '@ NgModule'. Использование атрибута 'entryComponents'' @ NgModule' должно сортировать это. – balteo

ответ

27

Это тоже меня поймало. Значительные изменения в RC5 в том, как вы маршрутизируете и загружаете с значительной опорой на app.module.ts и @NgModule декоратором. Документация была обновлена ​​здесь: https://angular.io/docs/ts/latest/ и изменений здесь: https://github.com/angular/angular/blob/master/CHANGELOG.md

Основные изменения в файле маршрутизации являются изменения в отчетности import и export. Простой пример показан ниже, который имеет два компонента, AppComponent и HomeComponent, что служит HomeComponent от index.html:

Файл: app.routing.ts

import { Routes, RouterModule } from '@angular/router'; 

import { HomeComponent } from './home.component'; 

const appRoutes: Routes = [ 
    { 
     path: '', 
     redirectTo: '/home', 
     pathMatch: 'full' 
    }, 
    { 
     path: 'home', 
     component: HomeComponent 
    } 
]; 

export const routing = RouterModule.forRoot(appRoutes);` 

Затем вам нужно использовать файл NgModule:

Файл: app.module.ts

import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 

import { AppComponent } from './app.component'; 
import { HomeComponent } from './home.component'; 

import { routing }  from './app.routing'; 

@NgModule({ 
    imports:  [ BrowserModule, routing ], 
    declarations: [ AppComponent, HomeComponent ], 
    bootstrap: [ AppComponent ] 
}) 
export class AppModule { } 

И тогда вы должны тянуть в AppModule - main.ts и бутстрап, используя его.

Файл: main.ts

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 
import { AppModule } from './app.module'; 
platformBrowserDynamic().bootstrapModule(AppModule);` 

Эта модель не производит предупредительное сообщение консоли.

+0

Это работает? вы должны получить ошибку в app.routing.ts нет импорта для HomeComponent? –

+1

Работал для меня. [5 Min Tutorial] (https://angular.io/docs/ts/latest/tutorial/toh-pt5.html) уже справляется с этими изменениями. Как тот, кто недавно следил за ним, мне пришлось пересмотреть его для большего количества изменений, связанных с 'NgModule'. Благодаря! –

+1

MrJSingh - вы правы, добавили в этот отсутствующий оператор импорта для HomeComponent. –

7

вам также необходимо добавить каждый компонент в свои маршруты к объявлениям NgModule. Много шаблонов. См. Угловой номер здесь https://github.com/angular/angular/issues/10472

+1

Я знаю, что ты прав, но я действительно думаю, что это шаг назад. Итак, в конце концов я импортирую каждый модуль, необходимый для маршрутизации там? Я думаю, что это будет очень грязно. Что делать, если у вас 20 маршрутов. Ремонтопригодность даже хуже, чем у Angular 1.x. – Michelangelo

+0

Спаситель прямо здесь –

4

У меня такая же проблема, но и на тестирующей части.

WARN: «Компонент RootCmp в NgModule DynamicTestModule использует BlankCmp через "entryComponents", но он не был ни объявлен не импортировался в модуль! Это предупреждение станет ошибкой после финала.

Как настроить DynamicTestModule?

8

Есть еще одна вещь, которую следует соблюдать в отношении этого предупреждения.

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

Так что я прошел через compiler.umd.js где получал сгенерированных предупреждение, и я заметил, что компонент, для которого я получаю сообщение об ошибке было добавляется в массив директив дважды здесь:

if (force || !transitiveModule.directivesSet.has(dirMeta.type.runtime)) { 
      transitiveModule.directivesSet.add(dirMeta.type.runtime); 
      transitiveModule.directives.push(dirMeta); 
      declaredDirectives.push(dirMeta); 
      this._addTypeToModule(dirMeta.type.runtime, moduleType); 
      return true; 
     } 

В принципе, хотя компонент уже был в директивах. Set, transitiveModule.directivesSet.has (dirMeta.type.runtime) оценивал значение false, поэтому он снова добавлялся, и один из них вызывал предупреждение.

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

//in routing 
import { SomeComponent } from './Directory/some.component'; 

//in app module 
import { SomeComponent } from './directory/some.component'; 

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

+2

Хотелось бы, чтобы я смог продвинуть этот * 1000. Эта проблема заставила меня бегать кругами вокруг моего кода на весь рабочий день. Благодаря! – dfl

+3

Спасибо, это определенно сложный вопрос, который сильно меня разочаровал. С тех пор я обнаружил, что хороший способ избежать этой проблемы в целом - использовать параметр компиляции TypeScript '-forceConsistentCasingInFileNames'. Это приведет к выявлению любых несоответствий в корпусе, прежде чем они вызовут проблемы. (Если вы работаете в VS, версия компиляции msbuild в файле проекта будет True). – doubletriplezero

1

Если вы обновляете большую кодовое то ни один из этих ответов не сказать вам, какой компонент вы забыли добавить app.module.ts

Ближайший ответ (если это ваша проблема) даются @ doubletriplezero

Он упоминает, что compiler.umd.js имеет полезную информацию.

На самом деле это может точно указать, какой компонент вы забыли импортировать. См

Angular 2 Component is not part of any NgModule

для более полного ответа

Смежные вопросы