ng-metadata-baden-fix1
Version:
Angular 2 decorators and utils for Angular 1.x
121 lines (120 loc) • 5.04 kB
TypeScript
import { OpaqueToken } from '../../core/di/opaque_token';
import { ProviderLiteral } from '../../core/di/provider_util';
import { Type } from '../../facade/type';
export declare type ProvideNg2InjectableParams = {
injectable: Function | Type;
downgradeFn: Function;
/**
* We need token only if downgraded Angular 2 Service is not Decorated with both ng2 @Injectable and ngMetadata @Injectable
*
*/
token?: string | OpaqueToken;
};
/**
* Downgrades an Angular 2 Injectable so that it can be registered as an Angular 1
* factory. Either a string or an ng-metadata OpaqueToken can be used for the name.
*
* **NOTE:** downgraded service must also be registered within Angular 2 `@Component` or `@NgModule`
*
* @example
* ```typescript
* // app.module.ts
* import * as angular from 'angular'
* import { downgradeInjectable } from '@angular/upgrade/static/';
* import { downgradeNg2Injectable } from 'ng-metadata/upgrade';
* import { provide } from 'ng-metadata/core';
*
* import { Ng2Service } from './services/ng2.service';
* import { Ng2ServiceDecorated } from './services/ng2decorated.service';
*
* export const OtherServiceToken = new OpaqueToken('otherService')
*
* export const AppModule = angular
* .module('myApp',[])
* .factory(...downgradeNg2Injectable({token:'ng2Service', injectable: Ng2Service, downgradeFn: downgradeInjectable }))
* .factory(...downgradeNg2Injectable({token: OtherServiceToken, injectable: Ng2Service, downgradeFn: downgradeInjectable }))
* .factory(...downgradeNg2Injectable({injectable:Ng2ServiceDecorated, downgradeFn: downgradeInjectable}))
* ```
*/
export declare function downgradeNg2Injectable({injectable, downgradeFn, token}: ProvideNg2InjectableParams): [string | Function];
/**
*
* Used to register an Angular 2 Service by including it in the `providers` array of an ng-metadata `@NgModule`,
* where the service name and downgraded factory functions are automatically generated.
*
* **NOTE:** downgraded service must also be registered within Angular 2 Component or NgModule
*
* Returns a `ProviderLiteral` which can be used to register an Angular 2 Provider/Injectable
* by including it in the providers array of an ng-metadata annotated Angular 1
* `@Component` or `@NgModule`. Either a string or an ng-metadata OpaqueToken can be used for the name.
*
* @example
* ```
* // foo.component.ts - Angular 1(ngMetadata)
* import { downgradeInjectable } from '@angular/upgrade/static/';
* import { provideNg2Injectable } from 'ng-metadata/upgrade';
* import { Component } from 'ng-metadata/core';
*
* import { Ng2Service } from './services/ng2.service';
* import { Ng2ServiceDecorated } from './services/ng2decorated.service';
*
* const OtherServiceToken = new OpaqueToken('otherService')
*
* @Component({
* selector: 'my-foo',
* providers: [
* provideNg2Injectable({token:'ng2Service', injectable: Ng2Service, downgradeFn: downgradeInjectable }),
* provideNg2Injectable({token:OtherServiceToken, injectable: Ng2Service, downgradeFn: downgradeInjectable }),
* provideNg2Injectable({injectable:Ng2ServiceDecorated, downgradeFn: downgradeInjectable}),
* ],
* })
* class FooComponent{}
* ```
*
* or via ngMetadata NgModule:
*
* @example
* ```typescript
* * @example
* ```
* // app.module.ts - Angular 1(ngMetadata)
* import { downgradeInjectable } from '@angular/upgrade/static/';
* import { provideNg2Injectable } from 'ng-metadata/upgrade';
* import { NgModule } from 'ng-metadata/core';
*
* import { Ng2Service } from './services/ng2.service';
* import { Ng2ServiceDecorated } from './services/ng2decorated.service';
*
* const OtherServiceToken = new OpaqueToken('otherService')
*
* @NgModule({
* providers: [
* provideNg2Injectable({token:'ng2Service', injectable: Ng2Service, downgradeFn: downgradeInjectable }),
* provideNg2Injectable({token:OtherServiceToken, injectable: Ng2Service, downgradeFn: downgradeInjectable }),
* provideNg2Injectable({injectable:Ng2ServiceDecorated, downgradeFn: downgradeInjectable}),
* ],
* })
* export class AppModule{}
* ```
*
* as you've may noticed in one registration we've omitted `token`, how is that possible that it works you ask?
* this is thanks to ngMetadata `@Injectable()` decorator, we can decorate Angular 2 Classes with our ngMetadata `@Injectable`,
* which gives us benefit to omit Opaque tokens creation and use the same class for DI for both Angular 2 and Angular 1.
* POWER OVERWHELMING RIGHT?!
*
* Enough Talk! Show me how the service looks like:
* ```typescript
* // ./services/ng2decorated.service.ts
*
* import {Injectable} from '@angular/core';
* import {Injectable as KeepNg1Injectable} from 'ng-metadata/core';
*
* @KeepNg1Injectable()
* @Injectable()
* export class Ng2ServiceDecorated {
* constructor(){}
* greet(){}
* }
* ```
*/
export declare function provideNg2Injectable({injectable, downgradeFn, token}: ProvideNg2InjectableParams): ProviderLiteral;