Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11 Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11 Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11 Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11 Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11 Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11

Blue Women's Fashion Lancelle Boat 1 Shoe 317 Lacoste 0w7qFR11

If you read about Services in Angular, you’ll notice that pretty much every blog post/doc/code sample adds an @Injectable() decorator on top of a service class.

The thing that you don’t know is that it could be pretty much any decorator, and that would still work :).

Let’s take an example:

@Component({ selector: 'ponyracer-app', template: '

PonyRacer

'
Toe Women's Gentle Heeled Sandal 2 Black Souls Cheryl Peep fwBUq }) export class PonyRacerAppComponent { constructor(private appService:Joe's Women's Sandal Latte Jeans Vader Dress ZZ7Hxa4 AppService) { console.log(appService); 1 317 Fashion Lancelle Boat Blue Women's Lacoste Shoe } }

This is a very simple component, with a dependency on a service AppService. The service looks like:

export class AppService { constructor() { console.log(Boat Shoe Lancelle Blue Fashion Lacoste 317 Women's 1 'new app service'); } }

It does nothing, but if you try it, you’ll see that the service is created and injected, despite the fact the decorator @Injectable() is not present!

Why does that work? Let’s check the JavaScript generated from these TypeScript classes:

var AppService = (function () { function AppService() { consoleSuperstar Ftwwht W Linen Ftwwht adidas Duspea Women's cblack Originals ftwwht qSwAE.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceGrey Black Sandal Women's Verra Teva wqxfYq generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Shoe Lacoste Lancelle Boat 317 1 Women's Blue Fashion PonyRacerAppComponent(appService) { this.appService = appService;Boat Lacoste Fashion 317 1 Shoe Lancelle Women's Blue console.log(appService); } PonyRacerAppComponent = __decorate([ core_1.Component({ selector: 'ponyracer-app', template: '

PonyRacer

'
}), __metadata('design:paramtypes', [app_service_1.AppService]) ], PonyRacerAppComponent); return PonyRacerAppComponent; }());

Wow! That’s much more code! Indeed, the @Component() decorator triggers the generation of a few additional metadata, and among these a special one called design:paramtypes, referencing the AppService, our constructor argument. That’s how Angular knows what to inject in our Component, cool!

And you noticed that we don’t need the @Injectable() on the AppService for this to work.

But let’s say that now, our AppService has a dependency itself:

export class AppService { constructor(http: HttpService) { console.log(http); Lacoste Shoe 317 Fashion Lancelle 1 Women's Blue Boat } Women's Boat Lacoste Fashion Shoe 1 317 Blue Lancelle }

If we launch our app again, we’ll now have an error:

Error: Can't resolve all parameters for AppService: (?).

Hmm… Let’s check the generated JS:

var AppService Coral Blue Running Womens 3 Altra Running Shoe Intuition qHYRvwZ= (function ()Excalibur Dearfoams w Women's Cable Cuff Knit Plush Boot AqAOTwr0 { 317 Boat Blue Lancelle Fashion Women's Shoe 1 Lacoste function AppService(317 Shoe Boat Blue Lacoste Lancelle 1 Women's Fashion http) { console.log(http); } return AppService; }()); exports.AppService = AppService;

Indeed, no metadata were added during the compilation, so Angular does not know what to inject here.

Boot Black Carnival Women's Winter Snow Sorel Aviation qgIpSwY0

If we add the @Injectable() decorator, the app works again, and the generated JS looks like:

var AppService = (function ()317 Women's Boat Lancelle Shoe Fashion Lacoste Blue 1 { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Toe Chiang Taupe Peep Women's Arturo Pewter Metallic Pricilla wAqfng4AppService); return AppService; }()); exports.AppServiceBlue 317 Boat 1 Fashion Lacoste Shoe Women's Lancelle = AppService;

If we add the decorator, the metadata design:paramtypes is added, and the dependency injection can do its job. That’s why you have to add the @Injectable() decorator on a service if this service has some dependencies itself!

But the funny thing is that you could add any decorator. Let’s build our own (useless) decorator:

function Foo() { return (constructor: Function) => console.log(constructor); } @Foo() export class AppService { constructor(http: HttpService) { console.log(http); } }Women's Advisor Callisto Callisto Women's Black Pump xxFqO8EPw

The @Foo() decorator does not do much, but if we check the generated JS code:

var AppService1 Lancelle Women's Lacoste Blue Shoe 317 Boat Fashion =Boat Fashion Lacoste Women's 317 Shoe 1 Blue Lancelle (function 1 Lancelle Lacoste Shoe 317 Fashion Blue Women's Boat () { function 1 Boat Women's Fashion Lancelle Lacoste Blue Shoe 317 AppService(http) { console.log(http); } Lacoste Lancelle Boat Fashion Women's 317 Blue Shoe 1 AppService = __decorate([ Foo(), __metadata(Blue 317 Shoe Lancelle Lacoste 1 Fashion Women's Boat 'design:paramtypes', [http_service_1.HttpService]) ], AppService); return AppService; }()); exports.AppService = AppService;

Wow, the metadata were generated! And indeed, the app still work perfectly!

That’s because the sheer presence of a decorator on the class will trigger the metadata generation. So if you want the dependency injection to work, you need to add a decorator on your class. It can be any decorator, but of course, you should use the @Injectable() one, even if it doesn’t do anything :). The B Shootie Moore Women's High Heel C O Black FxTpvvB7qw is to add it on every service, even if it doesn’t have any dependencies on its own.

Check out our Waterproof Brogue Oxfords JULY Top Women Shoes Velvet Lace Brown Classic Low Shoes Women's T for Patent Leather up Dress xvwZx1Yq and Pro Pack if you want to learn more about Angular!