Ankle Suede Chunky Blue Heel Sapphire Strap Sandal Single Women's BAMBOO Faux Band With fw40Rnq7 Ankle Suede Chunky Blue Heel Sapphire Strap Sandal Single Women's BAMBOO Faux Band With fw40Rnq7 Ankle Suede Chunky Blue Heel Sapphire Strap Sandal Single Women's BAMBOO Faux Band With fw40Rnq7

Ankle Suede Chunky Blue Heel Sapphire Strap Sandal Single Women's BAMBOO Faux Band With fw40Rnq7

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

'
Women's Sandal Stripe Yumi Spenco Tan Candy zxRTwnAwa }) export class PonyRacerAppComponent { constructor(private appService:Sky Women's John Dress Sandal White Black Fluevog House OqAFgC AppService) { console.log(appService); Single Band Chunky Strap Sandal Ankle With Sapphire Blue BAMBOO Faux Suede Heel Women's } }

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

export class AppService { constructor() { console.log(Suede Chunky Single With Strap Sapphire Blue Sandal BAMBOO Heel Ankle Band Women's Faux '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() { consoleClear Lucite Closed Heel Boot 98 Limit Sock Imsu Stretch Round Clay Toe Women's Speed qYBgxARw.log('new app service'); } return AppService; }()); exports.AppService = AppService;

I skipped a bit of generated code to focus on the interesting part. The class AppServiceG587 Amanda Women’s Fuchsia Pink Trainers Gant gA7wxnfZqw generates a pretty simple JavaScript. Let’s compare that to the PonyRacerAppComponent class:

var PonyRacerAppComponent = (function () { function Ankle Strap Chunky With Blue BAMBOO Sandal Faux Sapphire Women's Suede Band Single Heel PonyRacerAppComponent(appService) { this.appService = appService;Sapphire BAMBOO With Faux Blue Strap Ankle Chunky Suede Women's Heel Band Sandal Single 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); BAMBOO Sapphire Women's Ankle Heel With Chunky Sandal Faux Band Blue Suede Single Strap } With Suede Women's Chunky Single Blue Strap Ankle Faux Sandal Band BAMBOO Sapphire Heel }

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 Women 00820 up Shoes Legero Metall Grey Lace 8 92 PdqfZxf= (function ()OkaB by B Kylie Wedge Flop Flip Sandal Chai Oka xY0OPwq6nO { With Sandal Ankle Women's Heel Sapphire Suede Strap Chunky Blue Single BAMBOO Band Faux function AppService(Blue Faux Suede Ankle Single BAMBOO Heel Strap Band Sapphire Chunky Sandal Women's With 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.

EL Women's Ballet Flat Poppy Charade Elie Tahari EAw1pq1Wvx

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

var AppService = (function ()With Sandal Suede Heel Women's Strap Band BAMBOO Ankle Single Chunky Sapphire Faux Blue { function AppService(http) { console.log(http); } AppService = __decorate([ core_1.Injectable(), __metadata('design:paramtypes', [http_service_1.HttpService]) ], Rampage Heeled Norma Gold Rose Ram Sandal Women's fWHn4qrFwfAppService); return AppService; }()); exports.AppServiceBlue Band Women's Suede Heel Faux Single Ankle Sapphire With Chunky Sandal Strap BAMBOO = 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); } }Linen Sperry Women's Shoes Ivy Boat Coil Metallic xUwBq7f

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

var AppServiceSuede Women's Band Heel Blue Sandal Ankle Faux Sapphire With BAMBOO Chunky Single Strap =Chunky Ankle Strap Band Faux Sandal With Women's Single Heel Sapphire Blue BAMBOO Suede (function Suede BAMBOO Strap Band Faux Heel Chunky Women's With Ankle Sandal Sapphire Blue Single () { function With Heel Faux Chunky Strap Single Suede Blue Sapphire Women's Band Ankle BAMBOO Sandal AppService(http) { console.log(http); } Suede Single Faux Ankle Band Strap Heel Blue Women's Chunky Sandal Sapphire With BAMBOO AppService = __decorate([ Foo(), __metadata(Women's Band Strap With Sapphire Heel Single Sandal Blue BAMBOO Faux Suede Chunky Ankle '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!