In Angular 2 the concept of "transclusion" has been replaced by the concept of projection. ng-upgrade provides mechanisms for projecting/transcluding Angular 1.x content into Angular 2 components:
This is what a simple Angular 2 component that supports projection looks like:
import {Component, Input} from '@angular/core';​@Component({selector: 'a2-projection',template: `<p>Angular 2 Outer Component (Top)<ng-content></ng-content>Angular 2 Outer Component (Bottom)</p>`})export class A2Projection { }
Here's a very simple Angular 1.x directive that will be projected into the Angular 2 component:
export function a1ProjectionContentsDirective() {return {restrict: 'E',scope: {},bindToController: {},controller: A1ProjectionContents,controllerAs: 'a1ProjectionContents',template: `<p>{{ a1ProjectionContents.message }}</p>`};}​class A1ProjectionContents {message = 'I am an Angular 1 Directive "projected" into Angular 2';}
Both the component and the directive must be registered with Angular 1.x:
import {A2Projection} from './components/a2-projection';import {a1ProjectionContentsDirective} from'./components/a1-projection-contents';​// Angular 1 Vendor Importimport * as angular from 'angular';​// Import the upgradeAdapter singletonimport {upgradeAdapter} from './upgrade-adapter';​// Name the applicationconst APPNAME = 'angular-upgrade-example';​// Register classic Angular 1 modulesangular.module(APPNAME).directive('a2Projection',upgradeAdapter.downgradeNg2Component(A2Projection)).directive('a1ProjectionContent', a1ProjectionContentsDirective);
Finally, using the HTML selectors is as simple as:
<a2-projection><a1-projection-content></a1-projection-content></a2-projection>