Autoplay
Autocomplete
Previous Lesson
Complete and Continue
Complete Angular Developer in 2025: Zero to Mastery
Section 1: Introduction
Complete Angular Developer: Zero to Mastery (2:22)
What Are We Building? (4:17)
Exercise: Meet Your Classmates and Instructor
Complete Course Resources + Code
ZTM Plugin + Understanding Your Video Player
Set Your Learning Streak Goal
Section 2: Bootstrapping Angular
Understanding Frameworks (4:41)
The Angular CLI (4:17)
Upgrading Angular (2:15)
Creating a New Application (3:33)
Starting the Server (5:07)
Reviewing the Configuration Files (8:10)
Main Entry File (1:27)
AOT Compilation (5:04)
Bootstrapping Angular (5:27)
Understanding Components (2:03)
Creating Components (5:47)
External Templates and Styles (6:09)
Everything Else (1:54)
Section 3: TypeScript (OPTIONAL)
Introduction to TypeScript (5:12)
Installing TypeScript (3:47)
Type Annotations (4:52)
Variables (4:41)
Union Types (3:17)
Arrays (3:02)
Objects (3:31)
Interfaces (3:47)
Classes (3:34)
Generics (7:46)
Why Decorators (4:43)
TypeScript Configuration (2:50)
Writing Decorators (8:09)
Section 4: Component Fundamentals
Signals (10:11)
Property Binding (4:13)
Event Binding (7:03)
Type Assertions (5:38)
Creating a Component (4:45)
Custom Properties (8:04)
Required Inputs (2:30)
Emitting Events (8:46)
Content Projection (3:20)
Discovering Lifecycle Hooks (7:07)
Exploring More Lifecycle Hooks (10:43)
Scoped CSS (4:25)
Section 5: Transforming Content
Understanding Pipes (2:11)
Pipe Basics (4:59)
Angular Dev Tools (2:28)
Pipe Parameters (7:02)
Dealing with Numbers (8:06)
Debugging with Pipes (2:27)
Understanding Directives (1:31)
The ngClass Directive (6:44)
The ngStyle Directive (4:13)
If Block (2:17)
For Block (6:06)
Section 6: Master Project - Component Design
Introduction to the Master Project! (4:35)
What is Tailwind? (5:37)
Installing Tailwind (7:30)
Configuring Tailwind (2:33)
Practicing with Tailwind (6:31)
Loading Static Assets (6:16)
What’s Next? (3:34)
Navigation and Modal Components (6:36)
Designing a Modal (2:25)
Creating a Shared Component (2:31)
Creating a Reusable Modal (2:54)
Multi-slot Content Projection (3:15)
Understanding Services (3:37)
Creating a Service (1:26)
Understanding Dependency Injection (9:03)
Injecting Services (3:21)
Signal Queries (7:53)
Opening the Modal (6:40)
Closing the Modal (3:53)
Memory Leaks (6:32)
Fixing the memory leak (4:56)
Creating a Tabs Component (6:03)
The contentChildren Query Signal (4:50)
Looping through the Tabs (3:40)
Setting an Active Tab (5:40)
Toggling Tabs (5:17)
Preventing the Default Behavior (2:02)
Section 7: Master Project - Reactive Forms
Preparing the Forms (6:00)
Registering a New Form (4:55)
Adding Form Controls (3:19)
Binding a Form (3:09)
Form Validation (7:23)
Understanding Errors (4:36)
Handling Errors (5:21)
Form Controller Status (5:43)
Designing an Input Component (3:46)
Binding Form Controls (2:20)
Updating the Template (4:57)
Validating Emails (7:11)
Validating Numbers (6:01)
Validating Passwords with Patterns (6:18)
Input Masking (5:49)
Applying Input Masking (5:59)
Disabling Buttons (2:50)
Handling Form Submission (2:51)
Designing an Alert Component (11:29)
Section 8: Master Project - Template Forms
Importing the FormsModule (2:09)
Registering a new Form (3:39)
Two-way Binding (6:44)
Template Variables (5:50)
Attribute Validation (3:27)
Handling Error Messages (3:45)
Preparing the Password Field (4:15)
Handling Form Submission (3:56)
Section 9: Introduction to RxJS
Introduction to RxJS (5:55)
Observables (5:47)
Observers (4:22)
Pushing Asynchronous Values (3:40)
Unsubscribing from Observables (3:35)
Declarative Programming with Operators (5:48)
Timing Operators (5:27)
DOM Event Operators (2:16)
The of and from Operators (5:57)
Understanding Pipeable Operators (4:07)
The Map Operator (4:09)
Marble Diagram (2:45)
Filter Operator (7:27)
Reduce Operator (4:06)
Take Operator (4:18)
Tap Operator (3:28)
Understanding Flattening Operators (7:39)
mergeMap Operator (6:16)
switchMap Operator (5:05)
concatMap Operator (2:29)
exhaustMap Operator (2:34)
Flattening Operators Recap (2:22)
Section 10: Master Project - Authentication
Setting Up Firebase (7:11)
Reviewing the Rules (6:18)
Installing AngularFire (3:59)
Importing AngularFire (6:44)
User Registration (8:04)
Handling the Response (8:43)
Buckets, Collections and Documents (3:20)
Firestore Provider (1:50)
Storing User Data (6:17)
Refactoring to a Service (6:34)
Interfaces vs. Classes (6:20)
Connecting the User with their Data (10:26)
Database Rules (2:41)
Understanding Authentication (4:16)
Authentication after Registration (3:22)
The User Observable (3:45)
The Async Pipe (4:59)
Setting Up the Login (10:41)
Destroying the Modal (4:22)
The Delay Operator (3:54)
Signing Out (4:37)
Sidebar JSON Web Tokens (9:32)
Section 11: Master Project - Custom Validators
Validating Passwords (6:33)
Creating a Validator Class (3:34)
Factory Functions (6:11)
Handling Errors (6:03)
Creating an Asynchronous Validator (5:05)
Validating Unique Emails (5:21)
Finalizing the Validator (7:58)
Section 12: Master Project - Routing
Understanding Routing (5:29)
Configuring the Router (3:06)
Registering Routes (7:15)
Exercise Registering a Route (3:40)
Adding Navigation Links (3:45)
Active Links (7:07)
Creating the Manage Route (2:46)
Forcing Redirection (4:43)
A Quick Refactor (4:10)
Adding Route Data (5:49)
Filtering Router Events (4:37)
Retrieving Data Outside of the Outlet (6:50)
Exercise Registering a Route with Data (4:59)
Route Parameters (7:15)
Subscribing to Route Parameters (4:56)
Query Parameters (10:11)
Learning More About Query Parameters (8:35)
Selecting an Option (1:48)
Wildcard Routes (3:31)
Updating Routes (3:49)
Route Guards (5:47)
Section 13: Master Project - Uploading Files
Understanding File Uploads (3:27)
Blocking Events with Directives (8:35)
Handling Drag and Drop Events (7:51)
Handling Files (8:12)
Multi-Step Form (3:58)
The Upload Form (9:27)
Uploading Files with Firebase (9:18)
Firebase Rules and Validation (7:37)
Adding an Alert Component (5:30)
Upload Progress Observable (3:54)
Handling Errors and Successful Uploads (7:32)
Storing the File Data (6:05)
Adding the File Data to the Database (7:19)
Firebase References and Snapshots (2:24)
Disabling Forms (2:48)
Canceling Uploads (5:38)
Redirection after Upload (5:30)
Storing a Timestamp (4:26)
Querying the Database (7:31)
Storing the List of Clips (6:39)
Displaying the List of Clips (2:33)
Preparing the Form (6:38)
Passing on the Clip Data (3:28)
Binding the Edit Form (5:52)
Updating Clips (11:30)
Updating the List of Clips (8:52)
Deleting a Clip from the Storage and Database (11:32)
Sorting Clips with Computed Signals (5:07)
Section 14: WebAssembly & Rust
What is WebAssembly? (8:53)
Getting Started with Rust (6:20)
Exploring the Starter Project (6:46)
Variables (5:16)
Data Types (6:47)
Debugging with Macros (6:54)
Control Flow (4:40)
Match Expressions (7:50)
Arrays (2:50)
Vectors (5:20)
Structures (4:08)
Ownership (6:48)
Results (8:20)
Preparing the Project (3:39)
Installing Webpack (3:40)
Configuring Webpack (10:20)
Reading Files (8:10)
Compiling Rust with Webpack (4:46)
Importing Web Assembly (5:47)
Logging Files (9:21)
Base64 Decoding (3:48)
Loading an Image from Memory (2:59)
Grayscaling an Image (2:53)
Buffering an Image (5:18)
Encoding an Image (5:10)
App Deployment (4:06)
Section 15: Master Project - Processing Videos with FFmpeg
Understanding FFmpeg (2:47)
Installing FFmpeg (5:06)
Custom Asset Paths (5:18)
Adding support for SharedArrayBuffer (6:47)
Loading FFmpeg with a Service (4:07)
Initializing FFMPeg (6:05)
Saving Files in Memory (6:28)
Generating a Screenshot (11:04)
Generating Multiple Screenshots (5:13)
Creating Screenshot URLs (5:48)
Rendering Screenshots (3:09)
Adding Feedback (3:31)
Selecting a Screenshot (4:19)
Updating the Firebase Storage Rules (2:03)
Uploading a Blob (7:10)
Recalculating the Upload Progress (5:03)
The forkJoin Operator (5:15)
Deleting Screenshots (4:27)
Section 16: Master Project - Playing Videos
Introduction (1:44)
Creating a List Component (2:00)
Handling Scroll Events (8:26)
Querying for Clips (12:43)
Rendering Clips on the Home page (5:20)
Understanding Cross Origin Issues (3:44)
Fixing Cross Origin Issues (8:10)
Fixing the Timestamp (5:08)
Rendering Clips on the Clip Page (3:46)
Installing Videojs (1:37)
Selecting the Video Player (3:21)
Initializing the Video Player (1:42)
Clip Styles (2:10)
Resolving Data with a Guard (8:34)
Dynamically Rendering the Video (6:41)
Fixing the Manage Page (1:03)
Copying Links to the Clipboard (5:26)
Section 17: Master Project - Deployment
Production Budgets (3:28)
Modifying Firebase Rules (3:45)
Deploying an App with Vercel (10:46)
Section 18: Master Project - Testing
Introduction to Testing (11:26)
Understanding Karma and Jasmine (3:11)
Preparing Our App for Testing (3:11)
Writing a Sanity Test (6:04)
Angular’s Test Bed Utility (5:33)
Testing a Component’s Instance (6:28)
Querying the Component’s Template (6:40)
Inverting Matchers (3:16)
Testing Nested Components (5:10)
Testing Content Projection (6:33)
Custom Matcher Error Messages (2:32)
Mocking Services (6:30)
Overriding a Dependency (2:22)
Providing the Router in Tests (1:54)
Exercise Testing the Logout Link (2:59)
Simulating DOM Events (4:02)
Installing Cypress (6:45)
Exploring Cypress (6:04)
Writing an E2E Sanity Test (6:08)
Testing the Video Player (8:53)
Where To Go From Here?
Thank You! (1:17)
Review This Course!
Become An Alumni
Learning Guideline
ZTM Events Every Month
LinkedIn Endorsements
Providing the Router in Tests
This lecture is available exclusively for ZTM Academy members.
If you're already a member,
you'll need to login
.
Join ZTM To Unlock All Lectures