Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Input signals and model signals in Angular
📖 Scenario: You are building a simple Angular component that tracks a user's name input and displays it live.
🎯 Goal: Create an Angular standalone component that uses input signals to capture user input and a model signal to store and display the name.
📋 What You'll Learn
Create a standalone Angular component named NameTrackerComponent.
Use Angular signals to hold the user's name.
Use an input signal to capture the text input value.
Use a model signal to store the name.
Display the stored name below the input field.
💡 Why This Matters
🌍 Real World
This pattern is useful for forms where you want to separate the live input from the saved model, such as user profiles or settings.
💼 Career
Understanding Angular signals and how to bind them to inputs and models is essential for modern Angular development and reactive UI design.
Progress0 / 4 steps
1
Create the initial component with a signal for the name
Create a standalone Angular component called NameTrackerComponent with a signal named name initialized to an empty string.
Angular
Hint
Use signal('') to create a signal holding an empty string.
2
Add an input signal to capture user input
Add an inputName signal initialized to an empty string to capture the user's input separately from the stored name.
Angular
Hint
Create another signal named inputName with signal('').
3
Bind the input field to the input signal and update the model signal
In the component template, add an <input> element with [value] bound to inputName() and (input) event that updates inputName. Add a button that sets name to the current inputName() value when clicked.
Angular
Hint
Use [value]="inputName()" and (input)="inputName.set($any($event.target).value)" on the input. Use a button with (click)="name.set(inputName())".
4
Display the stored name below the input
Add a paragraph below the button that displays the stored name using interpolation with {{ name() }}.
Angular
Hint
Use interpolation {{ name() }} inside a paragraph tag below the button.
Practice
(1/5)
1. What is the main purpose of Input signals in Angular components?
easy
A. To receive reactive data from parent components
B. To send events to parent components
C. To style the component dynamically
D. To handle user input events
Solution
Step 1: Understand Input signals role
Input signals allow a component to get reactive data from its parent, keeping the data flow reactive and automatic.
Step 2: Differentiate from other options
Sending events to parents is done by outputs, styling is unrelated, and user input events are handled differently.
Final Answer:
To receive reactive data from parent components -> Option A
Quick Check:
Input signals = receive reactive data [OK]
Hint: Input signals bring data in from parents [OK]
Common Mistakes:
Confusing input signals with output events
Thinking input signals handle styling
Assuming input signals manage user events
2. Which of the following is the correct way to declare an input signal in an Angular standalone component?
easy
A. @Input() inputSignal = signal();
B. const inputSignal = signal();
C. const inputSignal = @Input(signal());
D. signal @Input() inputSignal;
Solution
Step 1: Recall Angular input signal syntax
Input signals are declared with the @Input() decorator followed by a signal initialization.
Step 2: Check each option
@Input() inputSignal = signal(); correctly uses @Input() decorator before the signal. const inputSignal = signal(); misses the decorator, C and D have invalid syntax.
Final Answer:
@Input() inputSignal = signal(); -> Option A
Quick Check:
Input signals need @Input() decorator [OK]
Hint: Use @Input() before signal declaration [OK]
Common Mistakes:
Forgetting the @Input() decorator
Placing @Input() incorrectly
Using invalid syntax with signals
3. Given this Angular component code snippet:
export class MyComponent {
@Input() count = signal(0);
increment() {
this.count.update(c => c + 1);
}
}
What will be the value of count() after calling increment() twice if the initial value is 0?
medium
A. 0
B. 1
C. undefined
D. 2
Solution
Step 1: Understand initial signal value
The signal count starts at 0.
Step 2: Apply increment method twice
Each call to increment() updates the signal by adding 1, so after two calls: 0 + 1 + 1 = 2.
Final Answer:
2 -> Option D
Quick Check:
0 + 2 increments = 2 [OK]
Hint: Each update adds 1 to the signal value [OK]
Common Mistakes:
Thinking signals don't update automatically
Confusing method calls with direct assignment
Assuming initial value changes unexpectedly
4. Identify the error in this Angular component code using input signals:
export class SampleComponent {
@Input() data = signal();
ngOnInit() {
this.data.set('Hello');
}
}
medium
A. Input signals must be readonly
B. Missing initial value for signal()
C. ngOnInit() is not allowed in standalone components
D. Cannot call set() on input signals
Solution
Step 1: Check signal initialization
The signal data is declared without an initial value, which is invalid.
Step 2: Understand signal requirements
Signals must have an initial value when created, so signal() without arguments causes an error.
Final Answer:
Missing initial value for signal() -> Option B
Quick Check:
Signals need initial values [OK]
Hint: Always initialize signals with a value [OK]
Common Mistakes:
Leaving signals uninitialized
Thinking set() is disallowed on inputs
Confusing lifecycle hooks usage
5. You want to create a component that receives a reactive input signal userName and also maintains a local model signal greeting that updates automatically when userName changes. Which approach correctly implements this behavior?
hard
A. Use @Input() userName: string; and create greeting = signal(''); updated by a setter
B. Use @Input() userName = signal(''); and update greeting manually in ngOnChanges
C. Use @Input() userName = signal(''); and inside the component create greeting = computed(() => `Hello, ${this.userName()}`);
D. Use @Input() userName = signal(''); and assign greeting = signal('Hello'); once in constructor
Solution
Step 1: Understand reactive input and model signals
The input signal userName provides reactive data from parent. The local greeting should react automatically to changes.
Step 2: Use computed signal for automatic updates
Using computed creates a signal that updates whenever userName() changes, keeping greeting in sync.
Final Answer:
Use @Input() userName = signal(''); and greeting = computed(() => `Hello, ${this.userName()}`); -> Option C
Quick Check:
Computed signals auto-update from input signals [OK]
Hint: Use computed() for dependent reactive signals [OK]