361 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			361 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
|  | // Examples of provider arrays
 | ||
|  | 
 | ||
|  | //#docplaster
 | ||
|  | import 'package:angular2/core.dart'; | ||
|  | import 'app_config.dart'; | ||
|  | import 'heroes/hero_service_provider.dart'; | ||
|  | import 'heroes/hero_service.dart'; | ||
|  | import 'logger_service.dart'; | ||
|  | import 'user_service.dart'; | ||
|  | 
 | ||
|  | // #docregion import-optional
 | ||
|  | import 'package:angular2/core.dart' show Optional; | ||
|  | // #enddocregion import-optional
 | ||
|  | 
 | ||
|  | const template = '{{log}}'; | ||
|  | 
 | ||
|  | //////////////////////////////////////////
 | ||
|  | @Component(selector: 'provider-1', template: '{{log}}', providers: | ||
|  | //#docregion providers-1
 | ||
|  | const [Logger] | ||
|  | //#enddocregion providers-1
 | ||
|  | ) | ||
|  | class ProviderComponent1 { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent1(Logger logger) { | ||
|  |     logger.log('Hello from logger provided with Logger class'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////
 | ||
|  | @Component(selector: 'provider-2', template: '{{log}}', providers: | ||
|  | //#docregion providers-2
 | ||
|  | const [const Provider(Logger, useClass: Logger)] | ||
|  | //#enddocregion providers-2
 | ||
|  | ) | ||
|  | class ProviderComponent2 { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent2(Logger logger) { | ||
|  |     logger.log('Hello from logger provided with Provider class and useClass'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////
 | ||
|  | @Component( | ||
|  |     selector: 'provider-3', | ||
|  |     template: '{{log}}', | ||
|  |     providers: const [const Provider(Logger, useClass: Logger)] | ||
|  | /* | ||
|  | //#docregion providers-3
 | ||
|  |     const [provide(Logger, useClass: Logger)] | ||
|  | //#enddocregion providers-3
 | ||
|  | */ | ||
|  | ) | ||
|  | class ProviderComponent3 { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent3(Logger logger) { | ||
|  |     logger.log('Hello from logger provided with useClass'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////
 | ||
|  | class BetterLogger extends Logger {} | ||
|  | 
 | ||
|  | @Component(selector: 'provider-4', template: '{{log}}', providers: | ||
|  | //#docregion providers-4
 | ||
|  | const [const Provider(Logger, useClass: BetterLogger)] | ||
|  | //#enddocregion providers-4
 | ||
|  | ) | ||
|  | class ProviderComponent4 { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent4(Logger logger) { | ||
|  |     logger.log('Hello from logger provided with useClass:BetterLogger'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | //////////////////////////////////////////
 | ||
|  | 
 | ||
|  | // #docregion EvenBetterLogger
 | ||
|  | @Injectable() | ||
|  | class EvenBetterLogger implements Logger { | ||
|  |   UserService _userService; | ||
|  | 
 | ||
|  |   List<String> logs = []; | ||
|  | 
 | ||
|  |   EvenBetterLogger(this._userService); | ||
|  | 
 | ||
|  |   log(String message) { | ||
|  |     message = 'Message to ${ _userService.user.name}: ${ message}.'; | ||
|  |     print(message); | ||
|  |     logs.add(message); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | // #enddocregion EvenBetterLogger
 | ||
|  | @Component(selector: 'provider-5', template: '{{log}}', providers: | ||
|  | //#docregion providers-5
 | ||
|  | const [UserService, const Provider(Logger, useClass: EvenBetterLogger)] | ||
|  | //#enddocregion providers-5
 | ||
|  | ) | ||
|  | class ProviderComponent5 { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent5(Logger logger) { | ||
|  |     logger.log('Hello from EvenBetterlogger'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | //////////////////////////////////////////
 | ||
|  | class NewLogger extends Logger implements OldLogger {} | ||
|  | 
 | ||
|  | class OldLogger { | ||
|  |   List<String> logs = []; | ||
|  | 
 | ||
|  |   log(String message) { | ||
|  |     throw new Exception('Should not call the old logger!'); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | @Component(selector: 'provider-6a', template: '{{log}}', providers: | ||
|  | //#docregion providers-6a
 | ||
|  | const [ | ||
|  |   NewLogger, | ||
|  | // Not aliased! Creates two instances of `NewLogger`
 | ||
|  |   const Provider(OldLogger, useClass: NewLogger) | ||
|  | ] | ||
|  | //#enddocregion providers-6a
 | ||
|  | ) | ||
|  | class ProviderComponent6a { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent6a(NewLogger newLogger, OldLogger oldLogger) { | ||
|  |     if (identical(newLogger, oldLogger)) { | ||
|  |       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.
 | ||
|  |     log = newLogger.logs == null || newLogger.logs.isEmpty ? oldLogger.logs[0] : newLogger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | @Component(selector: 'provider-6b', template: '{{log}}', providers: | ||
|  | //#docregion providers-6b
 | ||
|  | const [ | ||
|  |   NewLogger, | ||
|  | // Alias OldLogger w/ reference to NewLogger
 | ||
|  |   const Provider(OldLogger, useExisting: NewLogger) | ||
|  | //#enddocregion providers-6b
 | ||
|  | ]) | ||
|  | class ProviderComponent6b { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent6b(NewLogger newLogger, OldLogger oldLogger) { | ||
|  |     if (!identical(newLogger, oldLogger)) { | ||
|  |       throw new Exception('expected the two loggers to be the same instance'); | ||
|  |     } | ||
|  |     oldLogger.log('Hello from NewLogger (via aliased OldLogger)'); | ||
|  |     log = newLogger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | //////////////////////////////////////////
 | ||
|  | 
 | ||
|  | // #docregion silent-logger
 | ||
|  | 
 | ||
|  | // An object in the shape of the logger service
 | ||
|  | class SilentLogger /*implements Logger*/ { | ||
|  |   const SilentLogger({this.logs}); | ||
|  | 
 | ||
|  |   final List<String> logs; | ||
|  | 
 | ||
|  |   log(String message) {} | ||
|  | } | ||
|  | 
 | ||
|  | const silentLogger = const SilentLogger( | ||
|  |     logs: const ['Silent logger says "Shhhhh!". Provided via "useValue"']); | ||
|  | // #enddocregion silent-logger
 | ||
|  | 
 | ||
|  | @Component(selector: 'provider-7', template: '{{log}}', providers: | ||
|  | //#docregion providers-7
 | ||
|  | const [const Provider(SilentLogger, useValue: silentLogger)] | ||
|  | //#enddocregion providers-7
 | ||
|  | /* | ||
|  | //#docregion providers-7-unchecked
 | ||
|  | const [const Provider(Logger, useValue: silentLogger)] | ||
|  | //#enddocregion providers-7-unchecked
 | ||
|  |  */ | ||
|  | ) | ||
|  | class ProviderComponent7 { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent7(SilentLogger logger) { | ||
|  |     logger.log('Hello from logger provided with useValue'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /////////////////
 | ||
|  | @Component(selector: 'provider-8', template: '{{log}}', providers: const [ | ||
|  |   const Provider(HeroService, useFactory: heroServiceFactory), | ||
|  |   Logger, | ||
|  |   UserService | ||
|  | ]) | ||
|  | 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
 | ||
|  |   var log = 'Hero service injected successfully'; | ||
|  | } | ||
|  | 
 | ||
|  | /////////////////
 | ||
|  | @Component(selector: 'provider-9a', template: '{{log}}', providers: | ||
|  | /* | ||
|  |     // #docregion providers-9a-interface
 | ||
|  |     // WOKRKS! Can use abstract class as provider token
 | ||
|  |     [provide(Config, {useValue: CONFIG})] | ||
|  |     // #enddocregion providers-9a-interface
 | ||
|  |     */ | ||
|  | 
 | ||
|  | // #docregion providers-9a
 | ||
|  | // Use string as provider token
 | ||
|  | const [const Provider('app.config', useValue: CONFIG_HASH)] | ||
|  | //#enddocregion providers-9a
 | ||
|  | ) | ||
|  | class ProviderComponent9a implements OnInit { | ||
|  |   Config _config; | ||
|  | 
 | ||
|  |   String log; | ||
|  | 
 | ||
|  |   /* | ||
|  |   // #docregion provider-9a-ctor-interface
 | ||
|  |   // WORKS! Can inject using the abstract class as the parameter type
 | ||
|  |   Config _config; | ||
|  | 
 | ||
|  |   ProviderComponent9a(this._config); | ||
|  |   // #enddocregion provider-9a-ctor-interface
 | ||
|  |   */ | ||
|  | 
 | ||
|  |   // #docregion provider-9a-ctor
 | ||
|  | 
 | ||
|  |   // @Inject(token) to inject the dependency
 | ||
|  |   ProviderComponent9a(@Inject('app.config') Map config) { | ||
|  |     _config = new ConfigImpl(apiEndpoint: config['apiEndpoint'], title: config['title']); | ||
|  |   } | ||
|  | 
 | ||
|  |   // #enddocregion provider-9a-ctor
 | ||
|  |   ngOnInit() { | ||
|  |     log = '\'app.config\' Application title is ' + _config.title; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | @Component(selector: 'provider-9b', template: '{{log}}', providers: | ||
|  | // #docregion providers-9b
 | ||
|  | const [const Provider(APP_CONFIG, useValue: CONFIG_HASH)]) // #enddocregion providers-9b
 | ||
|  | class ProviderComponent9b | ||
|  |     implements OnInit { | ||
|  |   Config _config; | ||
|  | 
 | ||
|  |   String log; | ||
|  | 
 | ||
|  |   // #docregion provider-9b-ctor
 | ||
|  |   ProviderComponent9b(@Inject(APP_CONFIG) Map config) { | ||
|  |     _config = new ConfigImpl(apiEndpoint: config['apiEndpoint'], title: config['title']); | ||
|  |   } | ||
|  | 
 | ||
|  |   // #enddocregion provider-9b-ctor
 | ||
|  |   ngOnInit() { | ||
|  |     log = 'APP_CONFIG Application title is ' + _config.title; | ||
|  |   } | ||
|  | } | ||
|  | //////////////////////////////////////////
 | ||
|  | 
 | ||
|  | // Normal required logger
 | ||
|  | @Component(selector: 'provider-10a', template: '{{log}}', | ||
|  | //#docregion providers-logger
 | ||
|  |     providers: const [Logger] | ||
|  | //#enddocregion providers-logger
 | ||
|  | ) | ||
|  | class ProviderComponent10a { | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent10a(Logger logger) { | ||
|  |     logger.log('Hello from the required logger.'); | ||
|  |     log = logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | // Optional logger
 | ||
|  | @Component(selector: 'provider-10b', template: '{{log}}') | ||
|  | class ProviderComponent10b implements OnInit { | ||
|  |   Logger _logger; | ||
|  | 
 | ||
|  |   // #docregion provider-10-ctor
 | ||
|  |   String log; | ||
|  | 
 | ||
|  |   ProviderComponent10b(@Optional() this._logger); | ||
|  | 
 | ||
|  |   // #enddocregion provider-10-ctor
 | ||
|  |   ngOnInit() { | ||
|  |     // #docregion provider-10-logger
 | ||
|  | 
 | ||
|  |     // No logger? Make one!
 | ||
|  |     if (_logger == null) { | ||
|  |       _logger = new Logger(); | ||
|  |       // #enddocregion provider-10-logger
 | ||
|  |       _logger.log('Optional logger was not available.'); | ||
|  |     } else { | ||
|  |       _logger.log('Hello from the injected logger.'); | ||
|  |       log = _logger.logs[0]; | ||
|  |     } | ||
|  |     log = _logger.logs[0]; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | /////////////////
 | ||
|  | @Component( | ||
|  |     selector: 'my-providers', | ||
|  |     template: '''
 | ||
|  |   <h2>Provider variations</h2> | ||
|  |   <div id="p1"><provider-1></provider-1></div> | ||
|  |   <div id="p2"><provider-2></provider-2></div> | ||
|  |   <div id="p3"><provider-3></provider-3></div> | ||
|  |   <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> | ||
|  |   <div id="p9a"><provider-9a></provider-9a></div> | ||
|  |   <div id="p9b"><provider-9b></provider-9b></div> | ||
|  |   <div id="p10a"><provider-10a></provider-10a></div> | ||
|  |   <div id="p10b"><provider-10b></provider-10b></div> | ||
|  |   ''',
 | ||
|  |     directives: const [ | ||
|  |       ProviderComponent1, | ||
|  |       ProviderComponent2, | ||
|  |       ProviderComponent3, | ||
|  |       ProviderComponent4, | ||
|  |       ProviderComponent5, | ||
|  |       ProviderComponent6a, | ||
|  |       ProviderComponent6b, | ||
|  |       ProviderComponent7, | ||
|  |       ProviderComponent8, | ||
|  |       ProviderComponent9a, | ||
|  |       ProviderComponent9b, | ||
|  |       ProviderComponent10a, | ||
|  |       ProviderComponent10b | ||
|  |     ]) | ||
|  | class ProvidersComponent {} |