I have a global variable to store the list of countries like this:
export var COUNTRY_CODES = ["AD", "AE", "AF" /* and more */];
In one of my component, I'd imported the variable using normal import statement
import { COUNTRY_CODES } from "../constants";
I am able to access this global variable freely in my component code, but failed to achieve something like this on the HTML template:
<option *ngFor="let countryCode of COUNTRY_CODES" [value]="countryCode">{{countryCode | countryName}}</option>
I could just pass along the global variable to component by defining a local variable and assign the global variable to it during initialization.
ngOnInit() {
this.countryCodes = COUNTRY_CODES;
}
And change the ngFor
to loop on this local variable to make it works.
My question: Is this the right way to do? I'm not totally comfortable with defining bridging variables every time I want to use global variables in my template.
You are creating a variable countryCodes
in you component but the view is accessing COUNTRY_CODES
instead*
Global identifiers like Array
, window
, document
, class and enum names and global variables can't be accessed directly from within the template.
The scope of the template is the component class instance.
What you can do if you need access to any of these, is to create a getter in your component like
import { COUNTRY_CODES } from "../constants";
@Component(...)
export class MyComponent {
get countryCodes() { return COUNTRY_CODES; }
// or countryCodes = COUNTRY_CODES;
}
then it can be used in the template like
<option *ngFor="let countryCode of countryCodes" [value]="countryCode">{{countryCode | countryName}}</option>
Using a shared service like suggested in the other answers works similar. What's the better approach depends on the concrete use case. Services are easy to mock for unit tests in contrary to global variables.
See also
First #
you should note that there is a problem in your COUNTRY_CODES. you have put two double quotes at beginning.
It should be ,
Export var COUNTRY_CODES=["AD","AE","AF"];
Second #
Once you pass const value to this.countryCode
, you should use it in ngfor loop like,
*ngFor = "let cc in countryCode" [value]="cc"
OR
If you directly want to use it within HTML, Id suggest to make a sharedService
to define global variable.
UPDATE
Other way is you can use provide function and define your constant there in provide function
within bootstrap function
then inject it into respective component to use it.
Check out that way here,
Working Example
change this as
export var COUNTRY_CODES = ["AD", "AE", "AF"];
your code have extra "
in your array so you have to remove this first than your code run as smothly
working plunker
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