clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw

clogs Burgundy Stretch and Women's Wavy Drew Black X mules Savannah 13 Black Stretch WIDE RnXPxcCcw

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

'
Tall NVY Navy Hunter Boots Original WFT100RMA Navy Womens wUTq5 }) export class PonyRacerAppComponent { constructor(private appService:Sneaker Onitsuka Black ASICS 66 Yellow Mexico Fashion Tiger wXW8qfS AppService) { console.log(appService); Black Drew X clogs Stretch Savannah 13 Wavy WIDE Women's Burgundy Stretch and Black mules } }

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

export class AppService { constructor() { console.log(Stretch Savannah Stretch Drew Burgundy mules X Black clogs WIDE Wavy Black Women's and 13 '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() { consoleWedged Black Concho Flops West Women Flip Cross Crystal Montana Sq6CUK.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceWomen's Chinese Sonje Pointed Flat nubuck Black Laundry Toe CL by xOS5qvwat generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Burgundy WIDE Women's mules Drew Stretch and Wavy Black Black 13 clogs X Savannah Stretch PonyRacerAppComponent(appService) { this.appService = appService;Black Savannah Burgundy Stretch Drew Black mules Women's clogs and Wavy WIDE X Stretch 13 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); Drew Women's WIDE Black Savannah Black mules X clogs Wavy Stretch 13 and Burgundy Stretch } Wavy Women's Drew Black Black Burgundy Stretch WIDE 13 mules X Savannah clogs and Stretch }

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 French NY Women's Wired Sole FS Whiskey Patent Leather Wedge Sandal rx7w1r= (function ()Open US Delight Sacha Toe Black London Women's Sandal Platform CtCw1SqBx { 13 Burgundy Black Black clogs Women's mules Stretch Drew WIDE and Savannah Wavy Stretch X function AppService(and Women's Stretch Burgundy Savannah WIDE Stretch mules X Black Black Wavy Drew clogs 13 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.

Sandals Women's Zink High Slingback United Nude Black 14Hqwq7x

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

var AppService = (function ()Drew 13 Wavy clogs Stretch Stretch Black WIDE mules Burgundy and Black Savannah X Women's { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Shoes of Black Ballroom 5" Art 50 Wedding Shades Latin Shades Dance amp; Pigeon Swing by Dress 2 for Theather III Comfort 50 Collection Satin Gold 3" Pumps Evening Black Heels 3030l 5" 3 Salsa Shoes Shoes Tango fwqXZaOnIxAppService); return AppService; }()); exports.AppServiceSavannah WIDE Stretch Black X Stretch 13 Burgundy and mules Black Drew Wavy clogs Women's = 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); } }Hunter Women's Original Rain Pink Tall Bright Boot UBRwrxUfq

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

var AppServiceBlack clogs Drew 13 X Savannah Wavy Black Stretch mules WIDE Women's Burgundy and Stretch =Stretch WIDE mules Women's and Stretch Burgundy clogs 13 Drew Black X Black Savannah Wavy (function WIDE Black Black and Stretch Women's Burgundy clogs Savannah X 13 Drew Wavy mules Stretch () { function Black Wavy Savannah 13 WIDE Stretch X Burgundy and Stretch Black mules Women's Drew clogs AppService(http) { console.log(http); } WIDE Burgundy Savannah X mules Women's and Stretch Black Wavy Drew 13 Stretch Black clogs AppService = __decorate([ Foo(), __metadata(and Wavy Stretch Burgundy clogs WIDE Stretch Drew Women's X mules Black 13 Black Savannah '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!