📖 Scenario: You are building a simple Angular app that shows a list of fruits. You want to learn how Angular pipes work, especially the difference between pure and impure pipes.Pure pipes run only when the input changes by reference. Impure pipes run on every change detection cycle, even if the input reference is the same.
🎯 Goal: Create an Angular component that displays a list of fruits. Use a custom pipe to transform the list. First, create a pure pipe that filters fruits by a minimum length. Then, create an impure pipe that also filters fruits but updates even if the list reference does not change.
📋 What You'll Learn
Create a component with a fruits array
Create a pure pipe called filterPure that filters fruits by minimum length
Create an impure pipe called filterImpure that filters fruits by minimum length and is marked impure
Display the filtered fruits using both pipes in the template
💡 Why This Matters
🌍 Real World
Filtering and transforming data in Angular templates is common in real apps, like showing filtered product lists or formatted user data.
💼 Career
Understanding pure vs impure pipes helps write efficient Angular apps and avoid unnecessary UI updates, a key skill for frontend developers.
Progress0 / 4 steps
1
Set up the fruits array in the component
In the Angular component class, create a public array called fruits with these exact values: 'apple', 'banana', 'cherry', 'date', 'elderberry'.
Angular
Hint
Define a public property named fruits and assign the array with the exact fruit names.
2
Create a pure pipe to filter fruits by minimum length
Create a pure Angular pipe named filterPure. It should take an array of strings and a number minLength. Return a new array containing only fruits with length greater than or equal to minLength. The pipe must be pure (default).
Angular
Hint
Use @Pipe decorator with name: 'filterPure'. Implement PipeTransform interface and write the transform method to filter fruits by length.
3
Create an impure pipe to filter fruits by minimum length
Create an Angular pipe named filterImpure that filters fruits by minimum length like filterPure. Mark this pipe as pure: false in the @Pipe decorator to make it impure.
Angular
Hint
Use @Pipe decorator with name: 'filterImpure' and pure: false. Implement PipeTransform and write the transform method similarly to the pure pipe.
4
Use both pipes in the component template
In the component template, display two lists of fruits. Use the filterPure pipe with minLength = 6 to show fruits with length 6 or more. Below it, use the filterImpure pipe with the same minLength. Use *ngFor with let fruit of fruits | filterPure:6 and let fruit of fruits | filterImpure:6 respectively.
Angular
Hint
Use *ngFor directive with the pipes and minLength value 6 to show filtered fruits in separate lists.
Practice
(1/5)
1. What is the main difference between a pure pipe and an impure pipe in Angular?
easy
A. Pure pipes can modify input data, impure pipes cannot.
B. Pure pipes run every change detection cycle, impure pipes run only when input references change.
C. Pure pipes run only when input references change, impure pipes run every change detection cycle.
D. Pure pipes are slower than impure pipes.
Solution
Step 1: Understand pure pipe behavior
Pure pipes execute only when the input reference changes, meaning they do not run on every change detection cycle.
Step 2: Understand impure pipe behavior
Impure pipes run on every change detection cycle regardless of input changes, which can impact performance.
Final Answer:
Pure pipes run only when input references change, impure pipes run every change detection cycle. -> Option C
Quick Check:
Pure vs impure pipe execution = A [OK]
Hint: Pure pipes run less often; impure pipes run every cycle [OK]
Common Mistakes:
Confusing when pure and impure pipes run
Thinking pure pipes run every cycle
Assuming impure pipes only run on input change
2. Which of the following is the correct way to declare an impure pipe in Angular?
easy
A. @Pipe({ name: 'examplePipe', pure: false })
B. @Pipe({ name: 'examplePipe', impure: true })
C. @Pipe({ name: 'examplePipe' })
D. @Pipe({ name: 'examplePipe', pure: true })
Solution
Step 1: Recall pipe metadata syntax
Angular pipes use the @Pipe decorator with a 'pure' property to indicate purity.
Step 2: Identify impure pipe declaration
Setting 'pure: false' marks the pipe as impure, causing it to run every change detection cycle.
Final Answer:
@Pipe({ name: 'examplePipe', pure: false }) -> Option A
Quick Check:
Impure pipe uses pure: false [OK]
Hint: Impure pipes set pure to false in @Pipe decorator [OK]
If customPipe is pure and the array items is mutated by items.push(4) without changing the reference, what will happen?
medium
A. The pipe will run and update the output to include 4.
B. Angular throws an error due to mutation.
C. The pipe runs only if change detection is manually triggered.
D. The pipe will not run; output remains unchanged.
Solution
Step 1: Understand pure pipe input change detection
Pure pipes run only when the input reference changes, not when the content inside the object changes.
Step 2: Analyze mutation effect on pipe execution
Mutating the array with push() does not change the reference, so the pure pipe does not run again and output stays the same.
Final Answer:
The pipe will not run; output remains unchanged. -> Option D
Quick Check:
Pure pipe ignores internal mutations = C [OK]
Hint: Pure pipes need new object references to update [OK]
Common Mistakes:
Assuming mutation triggers pure pipe
Thinking Angular throws error on mutation
Believing manual change detection is required here
4. You have an Angular pipe declared as @Pipe({ name: 'filterPipe', pure: true }). It filters an array based on user input. The filtered results do not update when the user types. What is the likely cause?
medium
A. The pipe is impure and runs too often causing errors.
B. The pipe is pure and input array reference does not change on filtering.
C. The pipe is missing the transform method.
D. The pipe is declared without a name.
Solution
Step 1: Identify pipe purity and input behavior
A pure pipe runs only when the input reference changes, not when the content changes.