Angular dependency injection let you inject a string, function, or object using a token instead of a service class.
I declare it in my module like this:
providers: [{ provide: MyValueToken, useValue: 'my title value'}]
and I use it like this:
constructor(@Inject(MyValueToken) my_value: string) {
this.title = my_value;
}
However, how can I update the value from the component and let other components get every time the new value? in other words, I want to simulate the functionality of using something like a BehaviorSubject
to emit and receive values.
If this is not possible then what is the use of those injection tokens values if they provide only static data as instead I can simply declare the static value in my component and use it directly.
The Dependency Injection system in Angular uses tokens to uniquely identify a Provider. There are three types of tokens that you can create in Angular. They are Type Token, String Token, and Injection Token. DI Tokens.
If you specify the service class as the provider token, the default behavior is for the injector to instantiate that class using the new operator. In the following example, the Logger class provides a Logger instance.
To register a dependency using InjectionToken , we first need to create the InjectionToken class instance: export const APP_CONFIG = new InjectionToken('Application Configuration'); Then, use the token to register the dependency: { provide: APP_CONFIG, useValue: {name:'Test App', gridSetting: {...} ...});
Use an InjectionToken whenever the type you are injecting is not reified (does not have a runtime representation) such as when injecting an interface, callable type, array or parameterized type. InjectionToken is parameterized on T which is the type of object which will be returned by the Injector .
Instead of a primitive which is immutable, you can use a BehaviorSubject
, then access and update it in one component and subscribe in the other:
providers: [{ provide: MyValueToken, useValue: new BehaviorSubject('')}]
// consumer
constructor(@Inject(MyValueToken) my_value: BehaviorSubject) {
my_value.subscribe((my_value)=>this.title = my_value);
}
// producer
constructor(@Inject(MyValueToken) my_value: BehaviorSubject) {
my_value.next('my title value');
}
In addition to the Wizard:
If you have a use-case where every consumer needs its own instance of BehaviourSubject. (I happen to be in this use-case). Make sure you define a factory.
const myFactory = () => { return new BehaviorSubject<string>('') };
providers: [
{ provide: MyValueToken, useFactory: myFactory }
]
// Then, as proposed in the top-answer.
// consumer
constructor(@Inject(MyValueToken) my_value: BehaviorSubject) {
my_value.subscribe((my_value)=>this.title = my_value);
}
// producer
constructor(@Inject(MyValueToken) my_value: BehaviorSubject) {
my_value.next('my title value');
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With