<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tim Honermann</title>
	<atom:link href="https://tim-honermann.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://tim-honermann.com/</link>
	<description>Technical Blog about Angular; Java and many other interesting topics</description>
	<lastBuildDate>Sat, 09 Mar 2024 08:31:59 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://tim-honermann.com/wp-content/uploads/2023/10/cropped-1S79p0-LogoMakr-32x32.png</url>
	<title>Tim Honermann</title>
	<link>https://tim-honermann.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Angular Signal Inputs</title>
		<link>https://tim-honermann.com/angular-signal-inputs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=angular-signal-inputs</link>
					<comments>https://tim-honermann.com/angular-signal-inputs/#respond</comments>
		
		<dc:creator><![CDATA[Tim Honermann]]></dc:creator>
		<pubDate>Sun, 03 Mar 2024 16:37:34 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://tim-honermann.com/?p=737</guid>

					<description><![CDATA[<p>Signal Inputs allows developers to use a Signal for inputs values. The input can be used the same way as decorator based inputs, but with the benefit of using signals and signal functions like computed or effect to write more declarative and reactive code.</p>
<p>The post <a href="https://tim-honermann.com/angular-signal-inputs/">Angular Signal Inputs</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Signal Inputs, released as developer preview in version 17.1.0, allows developers to use a Signal for inputs values. They can be used the same way as decorator based inputs <code>@input()</code>, but with the benefit of providing an easier, more reactive way to handle input changes. </p>



<h3 class="wp-block-heading">How do I use signal inputs?</h3>



<p>Angular supports optional and required inputs, similar to <a href="https://tim-honermann.com/angular-required-inputs/">decorator inputs with the optional required property</a>.<br>Signal inputs don&#8217;t use decorators anymore to define inputs. Inputs are assigned to an input function, which also accepts a default value as an optional parameter:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>@Component({...})
export class MyComponentWithInputs {
  // required
  fooBar = input.required&lt;string&gt;();  // InputSignal&lt;string&gt;

  // optional
  foo = input&lt;string&gt;();              // InputSignal&lt;string|undefined&gt;
  bar = input&lt;string&gt;(&#39;bar&#39;);         // InputSignal&lt;string&gt;
}</code></pre></div>



<h3 class="wp-block-heading">Why should I use signal inputs over decorator based inputs?</h3>



<p>As mentioned above, signal inputs are still in developer preview and should therefore be used carefully. But the angular team advises using signal inputs as soon as they are production ready in a future version of Angular.<br>Signal inputs do provide some advantages over decorator based inputs:</p>



<ul class="wp-block-list">
<li><strong>Values </strong>can be <strong>derived</strong> in a declarative way by using the <code>computed</code> function</li>



<li><strong>Values</strong> can be <strong>observed</strong> by using the <code>effect</code> function instead of <code>ngOnChanges</code> or input setters</li>



<li><strong>Type Safety</strong>: Required inputs do not need initial values or the non-null assertion operator (&#8220;!&#8221;) to satisfy TypeScript. Also Input transformations are type-checked</li>



<li><strong>OnPush</strong> components will be <strong>marked as dirty</strong> when using signal inputs in the template</li>
</ul>



<p>The biggest difference I personally experienced was that I could use the <code>computed</code> and <code>effect</code> functions, which can be used to respond to changes of a signal. This reduced my use of <code>ngOnChanges</code> and input setters in my projects to an absolute minimum. Input changes do not need to be handled in the input setter or be caught by <code>ngOnChanges</code> anymore, and the <code>effect</code> and <code>computed</code> functions allow a more declarative way to handle input changes.</p>



<p>For demonstration purposes, I set up a project with two components. One using traditional decorator based inputs and the other one signal inputs. Both accept a number input named <code>count</code>. The number of count gets multiplied by 2 and displayed. Here&#8217;s the difference between the two components:</p>



<h5 class="wp-block-heading">Decorator Input Component</h5>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>@Component({...})
export class NormalInputComponent implements OnChanges {
  @Input({ required: true }) count = 0;

  doubleCount = 0;

  ngOnChanges(changes: SimpleChanges): void {
    if (changes[&#39;count&#39;]?.currentValue) {
      this.doubleCount = this.count * 2
    }
  }
}</code></pre></div>



<p>As we can see, we have to check with the <code>ngOnChanges</code> lifecycle hook if a change has happened to count. If this is the case, we assign the new value to the public variable <code>doubleCount</code>.</p>



<p>Alternatively, we could also use input setters instead of <code>ngOnChanges</code>:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>@Component({...})
export class NormalInputComponent {
  doubleCount = 0;

  @Input({required: true}) set count(c: number){
    this.doubleCount = c * 2;
  };
}</code></pre></div>



<p>This reduces the amount of code needed quite a bit. We still need to declare and assign the <code>doubleCount</code> variables on two different lines in the code. In the solution above, the value of count is not accessible from outside the setter. If you need the value of count itself, you would need to write it to a variable as well or create a private variable and create a getter to return the private variable. This results in some more lines of code:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>@Component({...})
export class NormalInputComponent {
  doubleCount = 0;

  private _count = 0;

  @Input({ required: true }) set count (c: number) {
    this._count = c;
    this.doubleCount = c * 2;
  }

  get count(): number {
    return this._count;
  }
}</code></pre></div>



<h5 class="wp-block-heading">Signal Input Component</h5>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>@Component({...})
export class SignalInputComponent {
  count = input.required&lt;number&gt;();

  doubleCount = computed(() =&gt; this.count() * 2);
}</code></pre></div>



<p>With signal inputs, we can assign <code>doubleCount</code> in a more declarative way directly by using the <code>computed</code> function, which responds to changes of the count input signal.</p>



<h3 class="wp-block-heading">How can I test a component with signal inputs?</h3>



<p>When testing components with decorator based inputs, we can assign values directly to the input variable. This is not possible with signal based inputs. The signal input type <code>SignalInput</code> is a non-writable signal, therefore we can not call component.mySignalInput.set(&#8230;) like we can with writable signals. The easiest way, in my opinion, to test signal inputs is to use the <code>componentRef.setInput(inputName, inputValue)</code> function.</p>



<p>In this example, I want to test if the <code>doubleCount</code> property is actually set based in the count input. Here&#8217;s how I use the <code>componentRef.setInput</code> function to test this behavior:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>it(&#39;should double count input&#39;, () =&gt; {
    // arrange
    const count = 4;
    const expectedDoubledCount = 8;

    // act
    fixture.componentRef.setInput(&#39;count&#39;, count);

    // assert
    expect(component.doubleCount()).toEqual(expectedDoubledCount);
  });</code></pre></div>



<p>As stated above, in most cases this is my preferred way to test signal inputs. There are other ways to test signal inputs, e.g. by using a Wrapper Component in your test to render your component and pass the inputs in the template. If you&#8217;re using the <a href="https://www.npmjs.com/package/@testing-library/angular">Angular Testing Library</a>, you can also use the render function as described in <a href="https://twitter.com/tim_deschryver/status/1762188138842071077">this x-post</a>.</p>



<h5 class="wp-block-heading">Set default value for required inputs</h5>



<p>When using required inputs, we need to set a default value for these inputs. Otherwise, your tests will fail, for example the default <em>&#8220;should create&#8221;</em>  test:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>beforeEach(async () =&gt; {
    await TestBed.configureTestingModule({
      imports: [SignalInputComponent]
    })
    .compileComponents();

    fixture = TestBed.createComponent(SignalInputComponent);
    component = fixture.componentInstance;

    fixture.componentRef.setInput(&#39;count&#39;, 0);
    fixture.detectChanges();
});</code></pre></div>



<h3 class="wp-block-heading">A more realistic scenario</h3>



<p>Imagine a very simple account management solution. We have a route <code>/accounts</code> where a list of accounts is displayed. When clicking on an account in the accounts list, the user gets redirected to the account detail page. So the user gets routed from <code>/accounts</code> to <code>/accounts/{id}</code>.<br>In the account detail page, the account data needs to be loaded from an API.</p>



<p>With Angular 16 a new feature was shipped that allows passing router data as component inputs. This feature can be enabled by using <code>withComponentInputBinding</code> in your <code>app.config</code> like so:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-file="app.config.ts" data-lang="TypeScript"><code>provideRouter(routes, withComponentInputBinding()),</code></pre></div>



<p>Now the ID parameter in the route can be accessed by adding an input with the same name as the parameter in the routes file. Sadly, Angular currently does not provide an option to clearly declare an input as a router data input so they look the same as normal inputs.</p>



<p>With the <code>id</code> as signal input the account can be loaded with the <code>toSignal</code> and <code>toObservable</code> functions.</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-file="account-detail.component.ts" data-lang="TypeScript"><code>@Component({...})
export class AccountDetailComponent {
  private readonly accountsService = inject(AccountsService);

  id = input.required&lt;string&gt;()

  account = toSignal(
    toObservable(this.id).pipe(switchMap((id) =&gt; this.accountsService.getAccountDetail(id)))
  )
}</code></pre></div>



<p>The ID input can be transformed to an observable and chain the HTTP request with a <code>switchMap</code>. Then the result from the HTTP request gets transformed back to a signal, which can be used in the template without the need to subscribe to it.</p>



<h3 class="wp-block-heading">Conclusion</h3>



<p>In this blog post, we have seen how we can react to input changes in a more declarative way by using signal inputs over decorator inputs. It is a long-awaited feature by the Angular Community to handle input changes more reactively. With signal inputs, they handed us the tools to do so.</p>



<p>You can find the code for the count example in my <a href="https://github.com/timhonermann/signal-inputs">GitHub repository</a>.</p>



<p>Thanks, Tim</p>
<p>The post <a href="https://tim-honermann.com/angular-signal-inputs/">Angular Signal Inputs</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tim-honermann.com/angular-signal-inputs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TypeScript one or the other</title>
		<link>https://tim-honermann.com/typescript-one-or-the-other/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=typescript-one-or-the-other</link>
					<comments>https://tim-honermann.com/typescript-one-or-the-other/#respond</comments>
		
		<dc:creator><![CDATA[Tim Honermann]]></dc:creator>
		<pubDate>Sat, 02 Dec 2023 20:02:41 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://tim-honermann.com/?p=722</guid>

					<description><![CDATA[<p>Sometimes we run into some code where we need to type a value as either one or the other. In this blog post, we will see how we can achieve this by leveraging TypeScript's never type.</p>
<p>The post <a href="https://tim-honermann.com/typescript-one-or-the-other/">TypeScript one or the other</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Sometimes we run into some code where we need to type a value as either one or the other. In this blog post, we will see how we can achieve this by leveraging TypeScript&#8217;s never type.</p>



<p>Let&#8217;s use shapes as an example. A shape can have a color, no matter what specific shape it is, but not every shape can have a radius or a side length. We could type it like this:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>interface ShapeBase {
  color: string;
}

interface Square extends ShapeBase {
  sideLength: number;
}

interface Circle extends ShapeBase {
  radius: number;
};

type Shape = Square | Circle;</code></pre></div>



<p>The problem with this type definition is, that an object of type <code>Shape</code> can have a color, side length and a radius without causing an error.</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>const myShape: Shape = {
  color: &#39;red&#39;,
  sideLength: 123,
  radius: 987
}</code></pre></div>



<p>How can we achieve that this object can either have a side length OR a radius, but not both?</p>



<p>For this to work, we have to leverage TypeScript&#8217;s <code>never</code> type. This type tells Typescript that this property should never exist and therefore results in an error. If you want to read more about never, check out the <a href="https://www.typescriptlang.org/docs/handbook/2/narrowing.html#the-never-type">TypeScript docs</a>. We need to set both properties on both types and mark the unwanted property as optional and type it as <code>never</code>.</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>interface Square extends ShapeBase {
  sideLength: number;
  radius?: never;
}

interface Circle extends ShapeBase {
  radius: number;
  sideLength?: never
};

type Shape = Square | Circle;</code></pre></div>



<p>If we try to create an object of Type Shape with a <code>radius</code> and <code>sideLength</code> property, TypeScript now tells us that an error occurred:</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="864" height="223" src="https://tim-honermann.com/wp-content/uploads/2023/12/image.png" alt="" class="wp-image-723" srcset="https://tim-honermann.com/wp-content/uploads/2023/12/image.png 864w, https://tim-honermann.com/wp-content/uploads/2023/12/image-300x77.png 300w, https://tim-honermann.com/wp-content/uploads/2023/12/image-768x198.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></figure>



<p>As long as we only set one property, either <code>radius</code> or <code>sideLength</code> TypeScript won&#8217;t complain anymore.<br><br>Thank you,<br>Tim</p>
<p>The post <a href="https://tim-honermann.com/typescript-one-or-the-other/">TypeScript one or the other</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tim-honermann.com/typescript-one-or-the-other/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Angular Layout Components</title>
		<link>https://tim-honermann.com/angular-layout-components/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=angular-layout-components</link>
					<comments>https://tim-honermann.com/angular-layout-components/#respond</comments>
		
		<dc:creator><![CDATA[Tim Honermann]]></dc:creator>
		<pubDate>Sun, 22 Oct 2023 15:55:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://tim-honermann.com/?p=678</guid>

					<description><![CDATA[<p>Sharing layouts between components is a pretty common use case (e.g. dialog components with a title, content and buttons). Global CSS classes are one way to share styles and therefore layout styling. Especially in larger projects, global CSS classes need a lot of love and discipline to not get messy. Layout Components are an alternative &#8230;</p>
<p class="read-more"> <a class="" href="https://tim-honermann.com/angular-layout-components/"> <span class="screen-reader-text">Angular Layout Components</span> Read More &#187;</a></p>
<p>The post <a href="https://tim-honermann.com/angular-layout-components/">Angular Layout Components</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Sharing layouts between components is a pretty common use case (e.g. dialog components with a title, content and buttons). Global CSS classes are one way to share styles and therefore layout styling. Especially in larger projects, global CSS classes need a lot of love and discipline to not get messy. Layout Components are an alternative solution for layout sharing. This blog post will show you how to create reusable Layout Components by leveraging <a href="https://angular.io/guide/content-projection">Angular’s content projection</a>.</p>



<h3 class="wp-block-heading">What are Layout Components?</h3>



<p>Layout Components are Components that make use of Angular&#8217;s content projection to place one or multiple contents in the correct space. A simple example would be a layout component that defines a header, a body, and a footer. If such a layout is used in multiple different locations, Layout Components allow us to style it once and reuse it without creating global classes.</p>



<p id="applied-layout-component">An applied layout component could look something like this:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-html" data-lang="HTML"><code>&lt;app-content-layout&gt;
    &lt;app-header slot=&quot;header&quot; /&gt;

    &lt;app-dashboard /&gt;

   &lt;app-footer slot=&quot;footer&quot; /&gt;
&lt;/app-content-layout&gt;</code></pre></div>



<p>This results in very declarative HTML where we not only see the used components but also where they are placed within the layout, similar to well named global CSS classes.</p>



<h3 class="wp-block-heading">How do I create a Layout Component?</h3>



<p>First, we need to create a new component with the Angular CLI <code>ng g c content-layout</code>.<br>Within the component&#8217;s HTML, we define different blocks. On these blocks, we apply <a href="https://angular.io/guide/content-projection#multi-slot-content-projection">Multi-slot content projection</a>. In this example, we define a Header and a Footer slot. For the content, we use the default slot. Therefore, no slot name for the block <code>content</code> needs to be defined.</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-html" data-lang="HTML"><code>&lt;div class=&quot;header&quot;&gt;
    &lt;ng-content select=&quot;[slot=&#39;header&#39;]&quot; /&gt;
&lt;/div&gt;

&lt;div class=&quot;content&quot;&gt;
    &lt;ng-content /&gt;
&lt;/div&gt;

&lt;div class=&quot;footer&quot;&gt;
    &lt;ng-content select=&quot;[slot=&#39;footer&#39;]&quot; /&gt;
&lt;/div&gt;</code></pre></div>



<p><em>Note: Technically, the <code>slot</code> keyword is not needed, and we could use <code>header</code> or <code>footer</code> directly. I like using it because, in my opinion, it leads to better readability within the HTML. I always know that <code>slot</code> is associated with a layout component.</em></p>



<p>Now we have to style the slots. In this example, the header will have a height of <code>80px </code>and the footer a height of <code>50px</code>. The content should take up the available space. In a flex container, this can be achieved by setting the shorthand property <code>flex </code>to <code>1</code>.</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-scss" data-lang="SCSS"><code>:host {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100%;

  .header {
    height: 80px;
  }

  .content {
    flex: 1;
    overflow: auto;
  }

  .footer {
    height: 50px;
  }
}</code></pre></div>



<p>That&#8217;s it, the layout component is ready for use like shown in the <a href="#applied-layout-component">example above</a>.</p>



<h3 class="wp-block-heading">Result</h3>



<p>To showcase the result, I created a simple header, dashboard and footer component.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="573" src="https://tim-honermann.com/wp-content/uploads/2023/10/layout_component-1024x573.png" alt="" class="wp-image-559" srcset="https://tim-honermann.com/wp-content/uploads/2023/10/layout_component-1024x573.png 1024w, https://tim-honermann.com/wp-content/uploads/2023/10/layout_component-300x168.png 300w, https://tim-honermann.com/wp-content/uploads/2023/10/layout_component-768x430.png 768w, https://tim-honermann.com/wp-content/uploads/2023/10/layout_component-1536x860.png 1536w, https://tim-honermann.com/wp-content/uploads/2023/10/layout_component.png 1681w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p>The code can be found in my <a href="https://github.com/timhonermann/angular-layout-components">GitHub Repository</a></p>
<p>The post <a href="https://tim-honermann.com/angular-layout-components/">Angular Layout Components</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tim-honermann.com/angular-layout-components/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Angular Required Inputs</title>
		<link>https://tim-honermann.com/angular-required-inputs/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=angular-required-inputs</link>
					<comments>https://tim-honermann.com/angular-required-inputs/#respond</comments>
		
		<dc:creator><![CDATA[Tim Honermann]]></dc:creator>
		<pubDate>Sun, 22 Oct 2023 10:14:51 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://tim-honermann.com/?p=556</guid>

					<description><![CDATA[<p>With the release of Angular v16, the Angular Team also shipped the required inputs feature. In this short blog post, we will see how it&#8217;s used and why it&#8217;s beneficial for your development process. What are required inputs? Required inputs allow us to mark an @Input field in components and directives as required. This means &#8230;</p>
<p class="read-more"> <a class="" href="https://tim-honermann.com/angular-required-inputs/"> <span class="screen-reader-text">Angular Required Inputs</span> Read More &#187;</a></p>
<p>The post <a href="https://tim-honermann.com/angular-required-inputs/">Angular Required Inputs</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>With the release of Angular v16, the Angular Team also shipped the required inputs feature. In this short blog post, we will see how it&#8217;s used and why it&#8217;s beneficial for your development process.</p>



<h3 class="wp-block-heading">What are required inputs?</h3>



<p>Required inputs allow us to mark an <code>@Input</code> field in components and directives as required. This means we can specify which inputs are needed for a component or directive to function properly. We can mark inputs as required by adding the required option to the input decorator:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-lang="TypeScript"><code>@Input({ required: true }) myRequiredProperty: number;</code></pre></div>



<p>When not specifying anything, this option will default to <code>false</code>.</p>



<h3 class="wp-block-heading">How does that improve my development process?</h3>



<p>By specifying an input as required, the app won&#8217;t compile if the parent does not set the input property:</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>error NG8008: Required input &#39;myRequiredProperty&#39; from component SomeRequiredInputComponent must be specified.</code></pre></div>



<p>This has <strong>two</strong> positive impacts:</p>



<ol class="wp-block-list">
<li>Developers are <strong>less prone to make errors</strong> when (re)using components</li>



<li><strong>Components are better readable</strong> by explicitly telling the developer which inputs are essential for their core functionality.</li>
</ol>



<p>Both impacts result in a <strong>more efficient development process</strong>.</p>



<p>Thank you for reading.</p>
<p>The post <a href="https://tim-honermann.com/angular-required-inputs/">Angular Required Inputs</a> appeared first on <a href="https://tim-honermann.com">Tim Honermann</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://tim-honermann.com/angular-required-inputs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
