| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | // Examples of provider arrays
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | // #docplaster
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | import 'package:angular2/core.dart'; | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | import 'app_config.dart'; | 
					
						
							|  |  |  | import 'heroes/hero_service_provider.dart'; | 
					
						
							|  |  |  | import 'heroes/hero_service.dart'; | 
					
						
							|  |  |  | import 'logger_service.dart'; | 
					
						
							|  |  |  | import 'user_service.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | // TODO file an issue: cannot use the following const in metadata.
 | 
					
						
							|  |  |  | const template = '{{log}}'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'provider-1', | 
					
						
							|  |  |  |     template: '{{log}}', | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     // #docregion providers-1, providers-logger
 | 
					
						
							|  |  |  |     providers: const [Logger] | 
					
						
							|  |  |  |     // #enddocregion providers-1, providers-logger
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | ) | 
					
						
							|  |  |  | class ProviderComponent1 { | 
					
						
							|  |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ProviderComponent1(Logger logger) { | 
					
						
							|  |  |  |     logger.log('Hello from logger provided with Logger class'); | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     log = logger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | /// Component just used to ensure that shared E2E tests pass.
 | 
					
						
							|  |  |  | @Component( | 
					
						
							|  |  |  |   selector: 'provider-3a', | 
					
						
							|  |  |  |   template: '{{log}}', | 
					
						
							|  |  |  |   providers: const [const Provider(Logger, useClass: Logger)] | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | class ProviderComponent3a { | 
					
						
							|  |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ProviderComponent3a(Logger logger) { | 
					
						
							|  |  |  |     logger.log('Hello from logger provided with {provide: Logger, useClass: Logger}'); | 
					
						
							|  |  |  |     log = logger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Injectable() | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | class BetterLogger extends Logger {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'provider-4', | 
					
						
							|  |  |  |     template: '{{log}}', | 
					
						
							|  |  |  |     providers: | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       // #docregion providers-4
 | 
					
						
							|  |  |  |       const [const Provider(Logger, useClass: BetterLogger)] | 
					
						
							|  |  |  |       // #enddocregion providers-4
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | ) | 
					
						
							|  |  |  | class ProviderComponent4 { | 
					
						
							|  |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ProviderComponent4(Logger logger) { | 
					
						
							|  |  |  |     logger.log('Hello from logger provided with useClass:BetterLogger'); | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     log = logger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // #docregion EvenBetterLogger
 | 
					
						
							|  |  |  | @Injectable() | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | class EvenBetterLogger extends Logger { | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   final UserService _userService; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   EvenBetterLogger(this._userService); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   @override void log(String message) { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     var name = _userService.user.name; | 
					
						
							|  |  |  |     super.log('Message to $name: $message'); | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | // #enddocregion EvenBetterLogger
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'provider-5', | 
					
						
							|  |  |  |     template: '{{log}}', | 
					
						
							|  |  |  |     providers: | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       // #docregion providers-5
 | 
					
						
							|  |  |  |       const [UserService, const Provider(Logger, useClass: EvenBetterLogger)] | 
					
						
							|  |  |  |       // #enddocregion providers-5
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | ) | 
					
						
							|  |  |  | class ProviderComponent5 { | 
					
						
							|  |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ProviderComponent5(Logger logger) { | 
					
						
							|  |  |  |     logger.log('Hello from EvenBetterlogger'); | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     log = logger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Injectable() | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | class NewLogger extends Logger implements OldLogger {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | class OldLogger extends Logger { | 
					
						
							|  |  |  |   @override | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   void log(String message) { | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |     throw new Exception('Should not call the old logger!'); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'provider-6a', | 
					
						
							|  |  |  |     template: '{{log}}', | 
					
						
							|  |  |  |     providers: | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       // #docregion providers-6a
 | 
					
						
							|  |  |  |       const [NewLogger, | 
					
						
							|  |  |  |         // Not aliased! Creates two instances of `NewLogger`
 | 
					
						
							|  |  |  |         const Provider(OldLogger, useClass: NewLogger)] | 
					
						
							|  |  |  |       // #enddocregion providers-6a
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | ) | 
					
						
							|  |  |  | class ProviderComponent6a { | 
					
						
							|  |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ProviderComponent6a(NewLogger newLogger, OldLogger oldLogger) { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     if (newLogger == oldLogger) { | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |       throw new Exception('expected the two loggers to be different instances'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     oldLogger.log('Hello OldLogger (but we want NewLogger)'); | 
					
						
							|  |  |  |     // The newLogger wasn't called so no logs[]
 | 
					
						
							|  |  |  |     // display the logs of the oldLogger.
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     log = newLogger.logs.isEmpty ? oldLogger.logs[0] : newLogger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'provider-6b', | 
					
						
							|  |  |  |     template: '{{log}}', | 
					
						
							|  |  |  |     providers: | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       // #docregion providers-6b
 | 
					
						
							|  |  |  |       const [NewLogger, | 
					
						
							|  |  |  |         // Alias OldLogger with reference to NewLogger
 | 
					
						
							|  |  |  |         const Provider(OldLogger, useExisting: NewLogger)] | 
					
						
							|  |  |  |       // #enddocregion providers-6b
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | class ProviderComponent6b { | 
					
						
							|  |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ProviderComponent6b(NewLogger newLogger, OldLogger oldLogger) { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     if (newLogger != oldLogger) { | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |       throw new Exception('expected the two loggers to be the same instance'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     oldLogger.log('Hello from NewLogger (via aliased OldLogger)'); | 
					
						
							|  |  |  |     log = newLogger.logs[0]; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | // #docregion silent-logger
 | 
					
						
							|  |  |  | // #docregion const-class
 | 
					
						
							|  |  |  | class SilentLogger implements Logger { | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   final List<String> logs = const ['Silent logger says "Shhhhh!". Provided via "useValue"']; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   const SilentLogger(); | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   void log(String message) { } | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | // #enddocregion const-class
 | 
					
						
							|  |  |  | // #docregion const-object
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const silentLogger = const SilentLogger(); | 
					
						
							|  |  |  | // #enddocregion const-object
 | 
					
						
							|  |  |  | // #enddocregion silent-logger
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component( | 
					
						
							|  |  |  |   selector: 'provider-7', | 
					
						
							|  |  |  |   template: '{{log}}', | 
					
						
							|  |  |  |   providers: | 
					
						
							|  |  |  |     // #docregion providers-7
 | 
					
						
							|  |  |  |     const [const Provider(Logger, useValue: silentLogger)] | 
					
						
							|  |  |  |     // #enddocregion providers-7
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | ) | 
					
						
							|  |  |  | class ProviderComponent7 { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   String log; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   ProviderComponent7(Logger logger) { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     logger.log('Hello from logger provided with useValue'); | 
					
						
							|  |  |  |     log = logger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | @Component( | 
					
						
							|  |  |  |   selector: 'provider-8', | 
					
						
							|  |  |  |   template: '{{log}}', | 
					
						
							|  |  |  |   providers: const [heroServiceProvider, Logger, UserService]) | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | class ProviderComponent8 { | 
					
						
							|  |  |  |   // #docregion provider-8-ctor
 | 
					
						
							|  |  |  |   ProviderComponent8(HeroService heroService); | 
					
						
							|  |  |  |   // #enddocregion provider-8-ctor
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // must be true else this component would have blown up at runtime
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   var log = 'Hero service injected successfully via heroServiceProvider'; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | @Component( | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   selector: 'provider-9', | 
					
						
							|  |  |  |   template: '{{log}}', | 
					
						
							|  |  |  |   // #docregion providers-9
 | 
					
						
							|  |  |  |   providers: const [ | 
					
						
							|  |  |  |     const Provider(APP_CONFIG, useValue: heroDiConfig)] | 
					
						
							|  |  |  |   // #enddocregion providers-9
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  | class ProviderComponent9 implements OnInit { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   Map _config; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   // #docregion provider-9-ctor
 | 
					
						
							|  |  |  |   ProviderComponent9(@Inject(APP_CONFIG) this._config); | 
					
						
							|  |  |  |   // #enddocregion provider-9-ctor
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void ngOnInit() { | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |     log = 'APP_CONFIG Application title is ${_config['title']}'; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  | // Sample providers 1 to 7 illustrate a required logger dependency.
 | 
					
						
							|  |  |  | // Optional logger, can be null.
 | 
					
						
							|  |  |  | @Component(selector: 'provider-10', template: '{{log}}') | 
					
						
							|  |  |  | class ProviderComponent10 implements OnInit { | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   final Logger _logger; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   String log; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   /* | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   // #docregion provider-10-ctor
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   HeroService(@Optional() this._logger) { | 
					
						
							|  |  |  |   // #enddocregion provider-10-ctor
 | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   ProviderComponent10(@Optional() this._logger) { | 
					
						
							|  |  |  |     const someMessage = 'Hello from the injected logger'; | 
					
						
							|  |  |  |     // #docregion provider-10-ctor
 | 
					
						
							|  |  |  |     if (_logger != null) | 
					
						
							|  |  |  |       _logger.log(someMessage); | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |   } | 
					
						
							|  |  |  |   // #enddocregion provider-10-ctor
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |   @override | 
					
						
							|  |  |  |   void ngOnInit() { | 
					
						
							|  |  |  |     log = _logger == null ? 'Optional logger was not available' : _logger.logs[0]; | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @Component( | 
					
						
							|  |  |  |     selector: 'my-providers', | 
					
						
							|  |  |  |     template: '''
 | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |       <h2>Provider variations</h2> | 
					
						
							|  |  |  |       <div id="p1"><provider-1></provider-1></div> | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       <div id="p3a"><provider-3a></provider-3a></div> | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |       <div id="p4"><provider-4></provider-4></div> | 
					
						
							|  |  |  |       <div id="p5"><provider-5></provider-5></div> | 
					
						
							|  |  |  |       <div id="p6a"><provider-6a></provider-6a></div> | 
					
						
							|  |  |  |       <div id="p6b"><provider-6b></provider-6b></div> | 
					
						
							|  |  |  |       <div id="p7"><provider-7></provider-7></div> | 
					
						
							|  |  |  |       <div id="p8"><provider-8></provider-8></div> | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       <div id="p9"><provider-9></provider-9></div> | 
					
						
							|  |  |  |       <div id="p10"><provider-10></provider-10></div>''',
 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |     directives: const [ | 
					
						
							|  |  |  |       ProviderComponent1, | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       ProviderComponent3a, | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |       ProviderComponent4, | 
					
						
							|  |  |  |       ProviderComponent5, | 
					
						
							|  |  |  |       ProviderComponent6a, | 
					
						
							|  |  |  |       ProviderComponent6b, | 
					
						
							|  |  |  |       ProviderComponent7, | 
					
						
							|  |  |  |       ProviderComponent8, | 
					
						
							| 
									
										
										
										
											2016-03-03 22:50:42 -08:00
										 |  |  |       ProviderComponent9, | 
					
						
							| 
									
										
										
										
											2016-06-03 11:16:46 -07:00
										 |  |  |       ProviderComponent10 | 
					
						
							| 
									
										
										
										
											2016-02-06 17:02:44 -05:00
										 |  |  |     ]) | 
					
						
							|  |  |  | class ProvidersComponent {} |