angularangular2-upgrade

Angular2 RC6 upgrade


after updating my project to RC6 following errors occurs:

Error: Typescript found the following errors:
  app.component.ts (12, 3): Argument of type '{ moduleId: string; selector: string; templateUrl: string; styleUrls: string[]; directives: (type...' is not assignable to parameter of type 'ComponentMetadataType'.
  Object literal may only specify known properties, and 'directives' does not exist in type 'ComponentMetadataType'.

app.component.ts

import {Component, OnInit} from '@angular/core';
import {NavbarComponent} from "./shared/navbar/navbar.component";
import {ROUTER_DIRECTIVES} from "@angular/router";
import {SidebarComponent} from "./shared/sidebar/sidebar.component";
import {FooterComponent} from "./shared/footer/footer.component";

@Component({
  moduleId: module.id,
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.css'],
  directives: [NavbarComponent, SidebarComponent, FooterComponent, ROUTER_DIRECTIVES]
})
export class AppComponent implements OnInit {

  ngOnInit(): any {
    return undefined;
  }

}

It take my a while, but I cant figure it out.


Solution

  • Directives and pipes must be defined in @NgModule If I'm reading correctly. Support inside @Component is removed.

    So yeah just move your directives into the NgModule

    At the moment you have : Component A with directives Ac and Component B with directives Bc and most likely one AppModule, you just have to move Ac and Bc into the AppModule. And yes, you have to remove them from the @Component declaration

    The directives will then be immediately available in the components that are defined in your module.


    Example from OP becomes:

    app.component.ts

    // imports...
    @Component({
      selector: 'app-root',
      templateUrl: 'app.component.html',
    })
    export class AppComponent {}
    

    app.module.ts

    // imports...
    @NgModule({
      declarations: [
        AppComponent,
        NavbarComponent, 
        SidebarComponent, 
        FooterComponent
      ],
      imports: [
        BrowserModule,
        CommonModule,
        FormsModule
      ],
      providers: [
                   //MyService, MyOtherService
                 ],
      entryComponents: [AppComponent],
      bootstrap: [AppComponent]
    })
    export class AppModule {}
    

    See the doc for router: router documentation