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
Recall & Review
beginner
What is a custom structural directive in Angular?
A custom structural directive changes the structure of the DOM by adding or removing elements based on logic you define. It controls how elements appear or disappear.
Click to reveal answer
beginner
Which Angular decorator is used to create a structural directive?
The @Directive decorator is used to create a structural directive. You add a selector without an asterisk (*) because the asterisk is a template syntax sugar, not part of the selector.
Click to reveal answer
intermediate
What is the role of TemplateRef and ViewContainerRef in a custom structural directive?
TemplateRef represents the template to be added or removed. ViewContainerRef is the place in the DOM where the template is inserted or removed.
Click to reveal answer
beginner
How do you use the * prefix in Angular templates with structural directives?
The * prefix is shorthand telling Angular to treat the element as a structural directive. It expands the directive to wrap the element's template.
Click to reveal answer
intermediate
What happens if you call viewContainer.clear() inside a structural directive?
Calling viewContainer.clear() removes all inserted views from the DOM, effectively hiding or removing the elements controlled by the directive.
Click to reveal answer
Which Angular class lets you insert or remove elements in a structural directive?
AElementRef
BTemplateRef
CViewContainerRef
DRenderer2
✗ Incorrect
ViewContainerRef controls where and how views are inserted or removed in the DOM.
What does the asterisk (*) before a directive name in a template mean?
AIt makes the directive a component
BIt marks the directive as structural
CIt disables the directive
DIt binds the directive to a service
✗ Incorrect
The * prefix tells Angular to treat the directive as structural, changing the DOM layout.
Which decorator is used to define a custom structural directive?
A@Directive
B@Injectable
C@Component
D@NgModule
✗ Incorrect
@Directive is used to create directives, including structural ones.
In a custom structural directive, what does TemplateRef represent?
AThe place to insert elements
BThe host element
CThe directive's class
DThe template to be rendered
✗ Incorrect
TemplateRef represents the template content that can be added or removed.
What is the effect of calling viewContainer.createEmbeddedView(templateRef)?
AIt inserts the template into the DOM
BIt updates the component's state
CIt changes the directive's selector
DIt removes the template from the DOM
✗ Incorrect
This method inserts the template into the DOM at the location of the view container.
Explain how you create and use a custom structural directive in Angular.
Think about how the directive controls DOM elements by adding or removing templates.
You got /4 concepts.
Describe the difference between TemplateRef and ViewContainerRef in the context of structural directives.
One is about the content, the other about where to put it.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of a custom structural directive in Angular?
easy
A. To style elements with CSS classes
B. To fetch data from a server
C. To handle user input events
D. To add or remove HTML elements dynamically based on conditions
Solution
Step 1: Understand structural directives role
Structural directives change the structure of the DOM by adding or removing elements.
Step 2: Identify the main use case
Custom structural directives let you control when parts of the page appear or disappear dynamically.
Final Answer:
To add or remove HTML elements dynamically based on conditions -> Option D
Quick Check:
Structural directives = dynamic HTML blocks [OK]
Hint: Structural directives control HTML blocks, not styles or events [OK]
Common Mistakes:
Confusing structural directives with attribute directives
Thinking they handle styling or events
Assuming they fetch data
2. Which of the following is the correct way to inject dependencies in a custom structural directive constructor?
easy
A. constructor(private http: HttpClient) {}
B. constructor(private elementRef: ElementRef, private renderer: Renderer2) {}
C. constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {}
D. constructor(private router: Router) {}
Solution
Step 1: Identify dependencies for structural directives
Structural directives need TemplateRef to access the template and ViewContainerRef to insert or remove views.
Step 2: Match constructor parameters
constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {} correctly injects TemplateRef and ViewContainerRef, which are essential for custom structural directives.
Final Answer:
constructor(private templateRef: TemplateRef<any>, private viewContainer: ViewContainerRef) {} -> Option C
Step 1: Analyze the directive behavior when condition is false
When appShowIf is false, viewContainer.clear() removes any embedded views, so nothing is rendered.
Step 2: Understand the usage effect
The <div> with 'Hello World' is inside the template controlled by the directive, so it won't appear if condition is false.
Final Answer:
Nothing will be rendered inside the div -> Option A
Quick Check:
False condition = no content shown [OK]
Hint: False input clears view container, so no content appears [OK]
Common Mistakes:
Thinking the div still renders empty
Assuming an error occurs
Confusing attribute directives with structural directives
4. Identify the error in this custom structural directive code:
@Directive({ selector: '[appIf]' })
export class IfDirective {
constructor(private templateRef: TemplateRef<any>) {}
@Input() set appIf(condition: boolean) {
if (condition) {
this.templateRef.createEmbeddedView();
}
}
}
medium
A. Incorrect selector syntax in @Directive decorator
B. Missing ViewContainerRef injection and usage to insert the view
C. Wrong input property name, should be 'appIfCondition'
D. No error, code is correct
Solution
Step 1: Check constructor dependencies
The directive injects only TemplateRef but misses ViewContainerRef, which is needed to insert or clear views.
Step 2: Analyze method usage
Calling createEmbeddedView() on TemplateRef alone is invalid; it should be called on ViewContainerRef with TemplateRef as argument.
Final Answer:
Missing ViewContainerRef injection and usage to insert the view -> Option B
Quick Check:
ViewContainerRef required to add views [OK]
Hint: Always inject ViewContainerRef to add or remove views [OK]
Common Mistakes:
Trying to create views directly from TemplateRef
Forgetting to inject ViewContainerRef
Misnaming input properties
5. You want to create a custom structural directive *appUnless that shows content only when a condition is false. Which implementation correctly achieves this behavior?
hard
A. Use if (!condition) to create the embedded view, else clear it
B. Use if (condition) to create the embedded view, else clear it
C. Always create the embedded view regardless of condition
D. Clear the view only when condition is false
Solution
Step 1: Understand the directive goal
*appUnless should show content only when the condition is false, so the view is created when !condition.
Step 2: Match logic to code
Using if (!condition) to create the embedded view and clearing it otherwise matches the requirement.
Final Answer:
Use if (!condition) to create the embedded view, else clear it -> Option A
Quick Check:
Show content when false = if (!condition) create view [OK]
Hint: Invert condition logic to show content only when false [OK]