Today I will bring you a very interesting and useful article. Have you ever had trouble using setter
and getter
methods in Angular? Rest assured, from Angular v16.1.0, an extremely useful new feature has been introduced that provides an easy and alternative approach to transformation – Transform input
values, thereby removing need to use setter
and getter
methods. Does it sound appealing?
Problem with Setters and Getters
To better understand, first, let’s learn about setter
and getter
. In object-oriented programming, setter
and getter
are methods used to set and get the value of properties. However, their use can sometimes cause unnecessary troubles.
For example, consider the code below:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">function</span> <span class="token function">toNumber</span> <span class="token punctuation">(</span> <span class="token parameter">value <span class="token operator">:</span> string <span class="token operator">|</span> number</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">isNumber</span> <span class="token punctuation">(</span> value <span class="token punctuation">)</span> <span class="token operator">?</span> value <span class="token operator">:</span> <span class="token function">parseInt</span> <span class="token punctuation">(</span> value <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> @ <span class="token function">Component</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> selector <span class="token operator">:</span> <span class="token string">'app-foo'</span> <span class="token punctuation">,</span> template <span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">,</span> standalone <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">FooComponent</span> <span class="token punctuation">{</span> @ <span class="token function">Input</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> transform <span class="token operator">:</span> toNumber <span class="token punctuation">}</span> <span class="token punctuation">)</span> width <span class="token operator">:</span> number <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
In the above code, when we use FooComponent
and pass width
input as a string:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> app-foo</span> <span class="token attr-name">width</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> 100 <span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> |
The toNumber
conversion function will handle the conversion, converting string values to numbers.
For programmers who are new or unfamiliar with this way of working, having to use setter
and getter
methods can get complicated and confusing.
Solution from Angular v16.1.0
Okay, so where’s the solution? That’s the new feature of Angular: transform
option. With transform
option, you can easily transform input values without having to use setter
and getter
. Consider a specific example below.
The code below illustrates how to use transform
option:
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">import</span> <span class="token punctuation">{</span> Input <span class="token punctuation">,</span> booleanAttribute <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@angular/core'</span> <span class="token punctuation">;</span> @ <span class="token function">Component</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> selector <span class="token operator">:</span> <span class="token string">'app-checkbox'</span> <span class="token punctuation">,</span> template <span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">,</span> standalone <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">CheckboxComponent</span> <span class="token punctuation">{</span> @ <span class="token function">Input</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> transform <span class="token operator">:</span> booleanAttribute <span class="token punctuation">}</span> <span class="token punctuation">)</span> disabled <span class="token operator">:</span> boolean <span class="token operator">=</span> <span class="token boolean">false</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
In the above code, the booleanAttribute
conversion function is used to handle the boolean conversion. Now, when we use CheckboxComponent
and specify the disabled
attribute:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> app-checkbox</span> <span class="token attr-name">disabled</span> <span class="token punctuation">/></span></span> |
The conversion function will properly interpret the presence of the property as true
.
Notably, Angular already uses this feature internally in router.
Solution for HTML attributes
Likewise, transform
option can also help us solve problems with HTML attributes. If you’ve ever worked with Angular, you’ve probably had the problem that Angular interprets all static properties as strings, which leads to a common problem. For example, the following code will return an empty string:
1 2 3 4 5 6 7 8 9 | @ <span class="token function">Component</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> selector <span class="token operator">:</span> <span class="token string">'app-checkbox'</span> <span class="token punctuation">,</span> template <span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">,</span> standalone <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token keyword">export</span> <span class="token keyword">class</span> <span class="token class-name">CheckboxComponent</span> <span class="token punctuation">{</span> @ <span class="token function">Input</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> disabled <span class="token operator">:</span> boolean <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> app-checkbox</span> <span class="token attr-name">disabled</span> <span class="token punctuation">/></span></span> |
To solve this problem, we can use transform
option instead of using getter
and setter
methods.
summary
Overall, with the introduction of transform
option in the @Input
decorator, Angular has simplified the input value conversion process, providing a more streamlined approach compared to traditional setter
and getter
methods.