import { UpgradeAdapter } from '@angular/upgrade';
/* . . . */
const upgradeAdapter = new UpgradeAdapter(AppModule);
upgradeAdapter.bootstrap(
document.body,
['heroApp'],
{strictDi: true}
);
// Angular 2 Component
import { HeroDetailComponent } from './hero-detail.component';
/* . . . */
angular.module('heroApp', [])
.directive(
'heroDetail',
upgradeAdapter
.downgradeNg2Component( HeroDetailComponent )
);
Angular 2
Component
<div ng-controller="MainController as mainCtrl">
<hero-detail [hero] = "mainCtrl.hero"
(deleted)= "mainCtrl.onDelete($event)"
ng-repeat= "hero in mainCtrl.heroes">
</hero-detail>
</div>
const HeroDetail = upgradeAdapter
.upgradeNg1Component('heroDetail');
@NgModule({
imports: [ BrowserModule ],
declarations: [ ContainerComponent, HeroDetail ]
})
export class AppModule {}
Angular 1
directive name
Binding definition Template syntax
Attribute binding myAttr : '@' <my-cmp myAttr="value">
Expression binding myOutput : '&' <my-cmp (myOutput)="action()">
One-way binding myValue : '<' <my-cmp [myValue]="Exp">
Two-way binding myValue : '=' <my-cmp [(myValue)]="Exp">
angular.module('heroApp', [])
.service ('heroes', HeroesService)
.directive('heroDetail',
upgradeAdapter
.downgradeNg2Component(HeroDetailComponent));
upgradeAdapter.upgradeNg1Provider('heroes');
angular.module('heroApp', [])
.factory('heroes',
upgradeAdapter.downgradeNg2Provider(Heroes))
.component('heroDetail', heroDetailComponent);
export const heroDetailComponent = {
template: `
<h2>{{$ctrl.hero.id}}: {{$ctrl.hero.name}}</h2>
`,
controller: ['heroes', function(heroes: Heroes) {
this.hero = heroes.get()[0];
}]
};
Upgrading from 1.X
Upgrading from Angular 1.x to Angular 2.x

Upgrading from Angular 1.x to Angular 2.x