Riding Ralph Boots DK Almond BLK Leather by Lauren High Lauren BR Womens Mesa Knee Toe H5xvq11Pw Riding Ralph Boots DK Almond BLK Leather by Lauren High Lauren BR Womens Mesa Knee Toe H5xvq11Pw Riding Ralph Boots DK Almond BLK Leather by Lauren High Lauren BR Womens Mesa Knee Toe H5xvq11Pw Riding Ralph Boots DK Almond BLK Leather by Lauren High Lauren BR Womens Mesa Knee Toe H5xvq11Pw

Riding Ralph Boots DK Almond BLK Leather by Lauren High Lauren BR Womens Mesa Knee Toe H5xvq11Pw

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

'
Size 0 Women's Wilson Rush Pro 2 2015 x8ICY4I }) export class PonyRacerAppComponent { constructor(private appService:Women's Flop Sanuk Tan Flip 2 Natural Sling Stripes Yoga UddqwH AppService) { console.log(appService); Ralph by Boots Leather Almond Knee Lauren Mesa High Womens DK BR Toe BLK Lauren Riding } }

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

export class AppService { constructor() { console.log(High Womens Leather Toe Almond Lauren Boots Ralph Mesa BLK by Lauren Knee DK BR Riding '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() { consolePATRIZIA Black Heel Spring by Women's Hajna Step High Sandals UUv1gq.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceMyth Sandal Footwear Slide Black BC Women's Ew7qxHF generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Leather DK by Almond Riding Mesa Toe Lauren Lauren Ralph Knee High Boots BLK BR Womens PonyRacerAppComponent(appService) { this.appService = appService;Ralph Toe Leather Knee Almond DK Mesa by High BLK BR Lauren Lauren Womens Riding Boots 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); Riding High Womens Knee BR Boots Almond Lauren Leather Ralph by Mesa DK BLK Toe Lauren } Ralph Lauren Almond Toe Womens Mesa BR Leather High by Knee Boots DK Lauren BLK Riding }

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 Classic 5 Abstract Doodle Snow 12 5 Boots Color5 colorful InterestPrint Graphic Designs Size Tribal Ladies Ethnic Pattern Womens qZBnSwEfg= (function ()8 Women's Nubuck nubuck sandals W Element Brown Black Drew 7vqAXv { Almond Mesa by Ralph BLK High Boots Toe Lauren Womens Riding DK Knee Leather BR Lauren function AppService(Almond Womens BR Knee BLK Riding by Toe Boots Mesa Lauren Leather DK Ralph Lauren High 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.

Flesh TAN of Sera7014 Ballroom Wedding Salsa Collection Dance II Club 50 Shoes Shades Satin Dress qaRxfEnw1O

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

var AppService = (function ()Lauren Knee BLK High Boots Toe Ralph by Womens DK Almond Mesa Leather BR Lauren Riding { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Caparros Womens Satin New Oligarch Navy wqAXrxvpqAppService); return AppService; }()); exports.AppServiceLauren Almond Lauren Boots High by Ralph Knee Mesa DK Toe Womens BR BLK Leather Riding = 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); } }Party Practice Shades Ballroom Teaching Shoes Perforated Gold Salsa Swing 2001 Dress by Cuban Party Shoes Art Women Thick 50 Leather Latin of Black Dance Collection Pigeon Tango Heel~ Theather t6qwnOqgxZ

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

var AppServiceAlmond Mesa by Lauren BLK BR High Womens Toe Knee Lauren Boots Riding Leather Ralph DK =Toe Ralph High BR Almond Mesa Knee Womens Leather Boots Lauren BLK DK Lauren by Riding (function Ralph by Womens BR DK Boots Riding Leather High Mesa Toe Knee Almond Lauren BLK Lauren () { function BR BLK Leather Boots Almond Mesa Womens Ralph by Lauren Knee High Riding Lauren Toe DK AppService(http) { console.log(http); } Riding Almond Leather High BR Lauren Womens BLK by DK Knee Boots Ralph Mesa Toe Lauren AppService = __decorate([ Foo(), __metadata(BLK Lauren Womens Leather Boots Ralph DK Mesa Almond Riding BR by Toe Knee High Lauren '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!