Learn Angular from a senior industry professional. This is the only Angular course you need to learn Angular, build enterprise-level applications from scratch & get hired as an Angular Developer in 2022. Go from Zero To Angular Mastery.
Complete Angular Developer in 2025 Zero to Mastery
Complete Angular Developer in 2025 Zero to Mastery is a 596-lesson 52 hours 28 minutes self-paced course by Zero To Mastery. Learn Angular from a senior industry professional.
Course facts
- Lessons
- 596
- Duration
- 52 hours 28 minutes
- Level
- All levels
- Language
- English
- Updated
- Instructor
- Zero To Mastery
- Price
- Premium
- Build enterprise-level applications using Angular 13 and TypeScript and deploy them to production
- Use WebAssembly and Rust in your applications to improve performance and combine with the power of Angular
- Use RxJS and Streams in your applications
- Set up authentication and user accounts
- Learn to build reactive, performant, large-scale applications like a Senior Developer
- Master Production and Deployment of a professional Angular app
- Master the latest ecosystem of a Angular Developer from scratch
- Learn to lead Angular projects by making good architecture decisions and helping others on your team
- Learn the latest features in Angular: Routing, Directives, Pipes, Services, Ahead of time Compilation + much more
- Master Angular Design Patterns
- Use Firebase to build full-stack applications
- Learn to deal with Memory Leaks in your projects to improve performance
- Learn to use TailwindCSS in an Angular application
- Become a top 10% Angular Developer
Who teaches Complete Angular Developer in 2025 Zero to Mastery? Zero To Mastery
Zero To Mastery (ZTM) is a Toronto-based online coding academy founded by Andrei Neagoie, originally a senior developer at large Canadian tech firms before turning to teaching full-time. The academy's signature is the cohort-based bootcamp track combined with a deep self-paced course library, all aimed at career-changers and self-taught developers preparing to land software-engineering roles at top companies.
The instructor roster has grown well beyond Andrei to include other senior practitioners: Daniel Bourke (machine learning), Aleksa Tešić (DevOps), Jacinto Wong, and others. Courses cover the full software-engineering career path: web development with React and Next.js, Python, machine learning and deep learning, DevOps and cloud, system design, mobile, and the algorithm / data-structure interview prep that gates engineering jobs.
The CourseFlix listing under this source carries over 120 ZTM courses spanning that full range. Material is paid; ZTM itself runs on a monthly / annual membership model. The teaching style favours long-form, project-based courses where students build complete portfolio-quality applications rather than disconnected feature tutorials.
What lessons are included in Complete Angular Developer in 2025 Zero to Mastery?
| # | Lesson Title | Duration | Access |
|---|---|---|---|
| 1 | Complete Angular Developer: Zero to Mastery Demo | 02:23 | |
| 2 | What Are We Building? | 04:18 | |
| 3 | Understanding Frameworks | 04:42 | |
| 4 | The Angular CLI | 04:18 | |
| 5 | Upgrading Angular | 02:16 | |
| 6 | Creating a New Application | 03:34 | |
| 7 | Starting the Server | 05:08 | |
| 8 | Reviewing the Configuration Files | 08:11 | |
| 9 | Main Entry File | 01:28 | |
| 10 | AOT Compilation | 05:05 | |
| 11 | Bootstrapping Angular | 05:28 | |
| 12 | Understanding Components | 02:04 | |
| 13 | Creating Components | 05:48 | |
| 14 | External Templates and Styles | 06:10 | |
| 15 | Everything Else | 01:55 | |
| 16 | Introduction to TypeScript | 05:13 | |
| 17 | Installing TypeScript | 03:48 | |
| 18 | Type Annotations | 04:53 | |
| 19 | Variables | 04:42 | |
| 20 | Union Types | 03:18 | |
| 21 | Arrays | 03:03 | |
| 22 | Objects | 03:32 | |
| 23 | Interfaces | 03:48 | |
| 24 | Classes | 03:35 | |
| 25 | Generics | 07:47 | |
| 26 | Why Decorators | 04:44 | |
| 27 | TypeScript Configuration | 02:51 | |
| 28 | Writing Decorators | 08:10 | |
| 29 | Signals | 10:12 | |
| 30 | Property Binding | 04:14 | |
| 31 | Event Binding | 07:04 | |
| 32 | Type Assertions | 05:39 | |
| 33 | Creating a Component | 04:46 | |
| 34 | Custom Properties | 08:05 | |
| 35 | Required Inputs | 02:31 | |
| 36 | Emitting Events | 08:47 | |
| 37 | Content Projection | 03:21 | |
| 38 | Discovering Lifecycle Hooks | 07:08 | |
| 39 | Exploring More Lifecycle Hooks | 10:44 | |
| 40 | Scoped CSS | 04:26 | |
| 41 | Understanding Pipes | 02:12 | |
| 42 | Pipe Basics | 05:00 | |
| 43 | Angular Dev Tools | 02:29 | |
| 44 | Pipe Parameters | 07:03 | |
| 45 | Dealing with Numbers | 08:07 | |
| 46 | Debugging with Pipes | 02:28 | |
| 47 | Understanding Directives | 01:32 | |
| 48 | The ngClass Directive | 06:45 | |
| 49 | The ngStyle Directive | 04:14 | |
| 50 | If Block | 02:18 | |
| 51 | For Block | 06:07 | |
| 52 | Introduction to the Master Project! | 04:36 | |
| 53 | What is Tailwind? | 05:38 | |
| 54 | Installing Tailwind | 07:31 | |
| 55 | Configuring Tailwind | 02:34 | |
| 56 | Practicing with Tailwind | 06:32 | |
| 57 | Loading Static Assets | 06:17 | |
| 58 | What’s Next? | 03:35 | |
| 59 | Navigation and Modal Components | 06:37 | |
| 60 | Designing a Modal | 02:26 | |
| 61 | Creating a Shared Component | 02:32 | |
| 62 | Creating a Reusable Modal | 02:55 | |
| 63 | Multi-slot Content Projection | 03:16 | |
| 64 | Understanding Services | 03:38 | |
| 65 | Creating a Service | 01:27 | |
| 66 | Understanding Dependency Injection | 09:04 | |
| 67 | Injecting Services | 03:22 | |
| 68 | Signal Queries | 07:54 | |
| 69 | Opening the Modal | 06:41 | |
| 70 | Closing the Modal | 03:54 | |
| 71 | Memory Leaks | 06:33 | |
| 72 | Fixing the memory leak | 04:57 | |
| 73 | Creating a Tabs Component | 06:04 | |
| 74 | The contentChildren Query Signal | 04:51 | |
| 75 | Looping through the Tabs | 03:41 | |
| 76 | Setting an Active Tab | 05:41 | |
| 77 | Toggling Tabs | 05:18 | |
| 78 | Preventing the Default Behavior | 02:03 | |
| 79 | Preparing the Forms | 06:01 | |
| 80 | Registering a New Form | 04:56 | |
| 81 | Adding Form Controls | 03:20 | |
| 82 | Binding a Form | 03:10 | |
| 83 | Form Validation | 07:24 | |
| 84 | Understanding Errors | 04:37 | |
| 85 | Handling Errors | 05:22 | |
| 86 | Form Controller Status | 05:44 | |
| 87 | Designing an Input Component | 03:47 | |
| 88 | Binding Form Controls | 02:21 | |
| 89 | Updating the Template | 04:58 | |
| 90 | Validating Emails | 07:12 | |
| 91 | Validating Numbers | 06:02 | |
| 92 | Validating Passwords with Patterns | 06:19 | |
| 93 | Input Masking | 05:50 | |
| 94 | Applying Input Masking | 06:00 | |
| 95 | Disabling Buttons | 02:51 | |
| 96 | Handling Form Submission | 02:52 | |
| 97 | Designing an Alert Component | 11:30 | |
| 98 | Importing the FormsModule | 02:10 | |
| 99 | Registering a new Form | 03:40 | |
| 100 | Two-way Binding | 06:45 | |
| 101 | Template Variables | 05:51 | |
| 102 | Attribute Validation | 03:28 | |
| 103 | Handling Error Messages | 03:46 | |
| 104 | Preparing the Password Field | 04:16 | |
| 105 | Handling Form Submission | 03:57 | |
| 106 | Introduction to RxJS | 05:56 | |
| 107 | Observables | 05:48 | |
| 108 | Observers | 04:23 | |
| 109 | Pushing Asynchronous Values | 03:41 | |
| 110 | Unsubscribing from Observables | 03:36 | |
| 111 | Declarative Programming with Operators | 05:49 | |
| 112 | Timing Operators | 05:28 | |
| 113 | DOM Event Operators | 02:17 | |
| 114 | The of and from Operators | 05:58 | |
| 115 | Understanding Pipeable Operators | 04:08 | |
| 116 | The Map Operator | 04:10 | |
| 117 | Marble Diagram | 02:46 | |
| 118 | Filter Operator | 07:28 | |
| 119 | Reduce Operator | 04:07 | |
| 120 | Take Operator | 04:19 | |
| 121 | Tap Operator | 03:29 | |
| 122 | Understanding Flattening Operators | 07:40 | |
| 123 | mergeMap Operator | 06:17 | |
| 124 | switchMap Operator | 05:06 | |
| 125 | concatMap Operator | 02:30 | |
| 126 | exhaustMap Operator | 02:35 | |
| 127 | Flattening Operators Recap | 02:23 | |
| 128 | Setting Up Firebase | 07:12 | |
| 129 | Reviewing the Rules | 06:19 | |
| 130 | Installing AngularFire | 04:00 | |
| 131 | Importing AngularFire | 06:45 | |
| 132 | User Registration | 08:05 | |
| 133 | Handling the Response | 08:44 | |
| 134 | Buckets, Collections and Documents | 03:21 | |
| 135 | Firestore Provider | 01:51 | |
| 136 | Storing User Data | 06:18 | |
| 137 | Refactoring to a Service | 06:35 | |
| 138 | Interfaces vs. Classes | 06:21 | |
| 139 | Connecting the User with their Data | 10:27 | |
| 140 | Database Rules | 02:42 | |
| 141 | Understanding Authentication | 04:17 | |
| 142 | Authentication after Registration | 03:23 | |
| 143 | The User Observable | 03:46 | |
| 144 | The Async Pipe | 05:00 | |
| 145 | Setting Up the Login | 10:42 | |
| 146 | Destroying the Modal | 04:23 | |
| 147 | The Delay Operator | 03:55 | |
| 148 | Signing Out | 04:38 | |
| 149 | Sidebar JSON Web Tokens | 09:33 | |
| 150 | Validating Passwords | 06:34 | |
| 151 | Creating a Validator Class | 03:35 | |
| 152 | Factory Functions | 06:12 | |
| 153 | Handling Errors | 06:04 | |
| 154 | Creating an Asynchronous Validator | 05:06 | |
| 155 | Validating Unique Emails | 05:22 | |
| 156 | Finalizing the Validator | 07:59 | |
| 157 | Understanding Routing | 05:30 | |
| 158 | Configuring the Router | 03:07 | |
| 159 | Registering Routes | 07:16 | |
| 160 | Exercise Registering a Route | 03:41 | |
| 161 | Adding Navigation Links | 03:46 | |
| 162 | Active Links | 07:08 | |
| 163 | Creating the Manage Route | 02:47 | |
| 164 | Forcing Redirection | 04:44 | |
| 165 | A Quick Refactor | 04:11 | |
| 166 | Adding Route Data | 05:50 | |
| 167 | Filtering Router Events | 04:38 | |
| 168 | Retrieving Data Outside of the Outlet | 06:51 | |
| 169 | Exercise Registering a Route with Data | 05:00 | |
| 170 | Route Parameters | 07:16 | |
| 171 | Subscribing to Route Parameters | 04:57 | |
| 172 | Query Parameters | 10:12 | |
| 173 | Learning More About Query Parameters | 08:36 | |
| 174 | Selecting an Option | 01:49 | |
| 175 | Wildcard Routes | 03:32 | |
| 176 | Updating Routes | 03:50 | |
| 177 | Route Guards | 05:48 | |
| 178 | Understanding File Uploads | 03:28 | |
| 179 | Blocking Events with Directives | 08:36 | |
| 180 | Handling Drag and Drop Events | 07:52 | |
| 181 | Handling Files | 08:13 | |
| 182 | Multi-Step Form | 03:59 | |
| 183 | The Upload Form | 09:28 | |
| 184 | Uploading Files with Firebase | 09:19 | |
| 185 | Firebase Rules and Validation | 07:38 | |
| 186 | Adding an Alert Component | 05:31 | |
| 187 | Upload Progress Observable | 03:55 | |
| 188 | Handling Errors and Successful Uploads | 07:33 | |
| 189 | Storing the File Data | 06:06 | |
| 190 | Adding the File Data to the Database | 07:20 | |
| 191 | Firebase References and Snapshots | 02:25 | |
| 192 | Disabling Forms | 02:49 | |
| 193 | Canceling Uploads | 05:39 | |
| 194 | Redirection after Upload | 05:31 | |
| 195 | Storing a Timestamp | 04:27 | |
| 196 | Querying the Database | 07:32 | |
| 197 | Storing the List of Clips | 06:40 | |
| 198 | Displaying the List of Clips | 02:34 | |
| 199 | Preparing the Form | 06:39 | |
| 200 | Passing on the Clip Data | 03:29 | |
| 201 | Binding the Edit Form | 05:53 | |
| 202 | Updating Clips | 11:31 | |
| 203 | Updating the List of Clips | 08:53 | |
| 204 | Deleting a Clip from the Storage and Database | 11:33 | |
| 205 | Sorting Clips with Computed Signals | 05:08 | |
| 206 | What is WebAssembly? | 08:54 | |
| 207 | Getting Started with Rust | 06:21 | |
| 208 | Exploring the Starter Project | 06:47 | |
| 209 | Variables | 05:17 | |
| 210 | Data Types | 06:48 | |
| 211 | Debugging with Macros | 06:55 | |
| 212 | Control Flow | 04:41 | |
| 213 | Match Expressions | 07:51 | |
| 214 | Arrays | 02:51 | |
| 215 | Vectors | 05:21 | |
| 216 | Structures | 04:09 | |
| 217 | Ownership | 06:49 | |
| 218 | Results | 08:21 | |
| 219 | Preparing the Project | 03:40 | |
| 220 | Installing Webpack | 03:41 | |
| 221 | Configuring Webpack | 10:21 | |
| 222 | Reading Files | 08:11 | |
| 223 | Compiling Rust with Webpack | 04:47 | |
| 224 | Importing Web Assembly | 05:48 | |
| 225 | Logging Files | 09:22 | |
| 226 | Base64 Decoding | 03:49 | |
| 227 | Loading an Image from Memory | 03:00 | |
| 228 | Grayscaling an Image | 02:54 | |
| 229 | Buffering an Image | 05:19 | |
| 230 | Encoding an Image | 05:11 | |
| 231 | App Deployment | 04:07 | |
| 232 | Understanding FFmpeg | 02:48 | |
| 233 | Installing FFmpeg | 05:07 | |
| 234 | Custom Asset Paths | 05:19 | |
| 235 | Adding support for SharedArrayBuffer | 06:48 | |
| 236 | Loading FFmpeg with a Service | 04:08 | |
| 237 | Initializing FFMPeg | 06:06 | |
| 238 | Saving Files in Memory | 06:29 | |
| 239 | Generating a Screenshot | 11:05 | |
| 240 | Generating Multiple Screenshots | 05:14 | |
| 241 | Creating Screenshot URLs | 05:49 | |
| 242 | Rendering Screenshots | 03:10 | |
| 243 | Adding Feedback | 03:32 | |
| 244 | Selecting a Screenshot | 04:20 | |
| 245 | Updating the Firebase Storage Rules | 02:04 | |
| 246 | Uploading a Blob | 07:11 | |
| 247 | Recalculating the Upload Progress | 05:04 | |
| 248 | The forkJoin Operator | 05:16 | |
| 249 | Deleting Screenshots | 04:28 | |
| 250 | Introduction | 01:45 | |
| 251 | Creating a List Component | 02:01 | |
| 252 | Handling Scroll Events | 08:27 | |
| 253 | Querying for Clips | 12:44 | |
| 254 | Rendering Clips on the Home page | 05:21 | |
| 255 | Understanding Cross Origin Issues | 03:45 | |
| 256 | Fixing Cross Origin Issues | 08:11 | |
| 257 | Fixing the Timestamp | 05:09 | |
| 258 | Rendering Clips on the Clip Page | 03:47 | |
| 259 | Installing Videojs | 01:38 | |
| 260 | Selecting the Video Player | 03:22 | |
| 261 | Initializing the Video Player | 01:43 | |
| 262 | Clip Styles | 02:11 | |
| 263 | Resolving Data with a Guard | 08:35 | |
| 264 | Dynamically Rendering the Video | 06:42 | |
| 265 | Fixing the Manage Page | 01:04 | |
| 266 | Copying Links to the Clipboard | 05:27 | |
| 267 | Production Budgets | 03:29 | |
| 268 | Modifying Firebase Rules | 03:46 | |
| 269 | Deploying an App with Vercel | 10:47 | |
| 270 | Introduction to Testing | 11:27 | |
| 271 | Understanding Karma and Jasmine | 03:12 | |
| 272 | Preparing Our App for Testing | 03:12 | |
| 273 | Writing a Sanity Test | 06:05 | |
| 274 | Angular’s Test Bed Utility | 05:34 | |
| 275 | Testing a Component’s Instance | 06:29 | |
| 276 | Querying the Component’s Template | 06:41 | |
| 277 | Inverting Matchers | 03:17 | |
| 278 | Testing Nested Components | 05:11 | |
| 279 | Testing Content Projection | 06:34 | |
| 280 | Custom Matcher Error Messages | 02:33 | |
| 281 | Mocking Services | 06:31 | |
| 282 | Overriding a Dependency | 02:23 | |
| 283 | Providing the Router in Tests | 01:55 | |
| 284 | Exercise Testing the Logout Link | 03:00 | |
| 285 | Simulating DOM Events | 04:03 | |
| 286 | Installing Cypress | 06:46 | |
| 287 | Exploring Cypress | 06:05 | |
| 288 | Writing an E2E Sanity Test | 06:09 | |
| 289 | Testing the Video Player | 08:54 | |
| 290 | Thank You! | 01:18 | |
| 291 | Understanding Frameworks | 04:41 | |
| 292 | The Angular CLI | 04:09 | |
| 293 | Latest Version Of Angular | 02:22 | |
| 294 | Creating a New Application | 03:36 | |
| 295 | Starting the Server | 05:09 | |
| 296 | Reviewing the Configuration Files | 07:44 | |
| 297 | Main Entry File | 01:26 | |
| 298 | AOT Compilation | 05:02 | |
| 299 | Loading a Platform | 03:00 | |
| 300 | Bootstrapping Angular | 02:48 | |
| 301 | Enabling Production Mode | 04:29 | |
| 302 | Understanding Modules | 04:01 | |
| 303 | Creating Modules | 06:06 | |
| 304 | Understanding Components | 01:59 | |
| 305 | Creating Components | 06:01 | |
| 306 | External Templates and Styles | 06:00 | |
| 307 | Everything Else | 03:45 | |
| 308 | Introduction to TypeScript | 05:09 | |
| 309 | Installing TypeScript | 03:46 | |
| 310 | Type Annotations | 04:51 | |
| 311 | Variables | 04:40 | |
| 312 | Union Types | 03:15 | |
| 313 | Arrays | 03:01 | |
| 314 | Objects | 03:31 | |
| 315 | Interfaces | 03:46 | |
| 316 | Classes | 03:32 | |
| 317 | Generics | 07:42 | |
| 318 | Why Decorators? | 04:39 | |
| 319 | TypeScript Configuration | 01:57 | |
| 320 | Writing Decorators | 07:04 | |
| 321 | Interpolation | 07:46 | |
| 322 | Property Binding | 03:50 | |
| 323 | Event Binding | 06:18 | |
| 324 | Type Assertions | 05:38 | |
| 325 | Creating a Component | 05:32 | |
| 326 | Custom Properties | 06:44 | |
| 327 | Input Aliases | 02:45 | |
| 328 | Emitting Events | 09:11 | |
| 329 | Content Projection | 03:18 | |
| 330 | Discovering Lifecycle Hooks | 06:08 | |
| 331 | Exploring More Lifecycle Hooks | 10:33 | |
| 332 | Scoped CSS | 04:24 | |
| 333 | Understanding Pipes | 02:07 | |
| 334 | Pipe Basics | 05:43 | |
| 335 | Angular Dev Tools | 02:40 | |
| 336 | Pipe Parameters | 06:16 | |
| 337 | Dealing with Numbers | 07:14 | |
| 338 | Debugging with Pipes | 01:51 | |
| 339 | Understanding Directives | 02:00 | |
| 340 | The ngClass Directive | 05:10 | |
| 341 | The ngStyle Directive | 04:12 | |
| 342 | Understanding ng-template | 02:12 | |
| 343 | The ngIf Directive | 03:51 | |
| 344 | The ngFor directive | 05:44 | |
| 345 | Introduction to Master Project | 06:03 | |
| 346 | What is Tailwind? | 05:37 | |
| 347 | Installing Tailwind | 07:16 | |
| 348 | Configuring Tailwind | 02:31 | |
| 349 | Practicing with Tailwind | 05:26 | |
| 350 | Loading Static Assets | 06:17 | |
| 351 | What’s Next? | 03:31 | |
| 352 | Creating a User Module | 04:36 | |
| 353 | Navigation and Modal Components | 05:34 | |
| 354 | Exporting Components | 03:25 | |
| 355 | Designing a Modal | 02:24 | |
| 356 | Creating a Shared Module | 04:10 | |
| 357 | Creating a Reusable Modal | 02:49 | |
| 358 | Multi-slot Content Projection | 03:13 | |
| 359 | Understanding Services | 03:32 | |
| 360 | Creating a Service | 01:42 | |
| 361 | Understanding Dependency Injection | 05:35 | |
| 362 | Injecting Services | 05:12 | |
| 363 | Opening the Modal | 05:52 | |
| 364 | Closing the Modal | 03:10 | |
| 365 | Understanding Singletons | 03:47 | |
| 366 | Creating an ID System | 05:46 | |
| 367 | Refactoring the Service | 05:06 | |
| 368 | Updating the Components | 04:47 | |
| 369 | Memory Leaks | 06:03 | |
| 370 | Fixing the Memory Leak | 04:47 | |
| 371 | CSS Issues | 05:50 | |
| 372 | Creating a Tabs Component | 06:05 | |
| 373 | The ContentChildren Decorator | 05:41 | |
| 374 | The QueryList Object | 03:23 | |
| 375 | Looping through the Tabs | 03:21 | |
| 376 | Setting an Active Tab | 07:08 | |
| 377 | Toggling Tabs | 04:18 | |
| 378 | Preventing the Default Behavior | 02:00 | |
| 379 | Preparing the Forms | 05:44 | |
| 380 | Registering a new Form | 04:16 | |
| 381 | Adding Form Controls | 03:16 | |
| 382 | Binding a Form | 03:06 | |
| 383 | Form Validation | 07:12 | |
| 384 | Understanding Errors | 04:17 | |
| 385 | Handling Errors | 05:17 | |
| 386 | Form Controller Status | 05:50 | |
| 387 | Designing an Input Component | 03:51 | |
| 388 | Binding Form Controls | 08:24 | |
| 389 | Updating the Template | 06:28 | |
| 390 | Validating Emails | 06:50 | |
| 391 | Validating Numbers | 05:58 | |
| 392 | Validating Passwords with Patterns | 06:01 | |
| 393 | Input Masking | 05:55 | |
| 394 | Applying Input Masking | 06:06 | |
| 395 | Disabling Buttons | 05:12 | |
| 396 | Handling Form Submission | 02:50 | |
| 397 | Designing an Alert Component | 10:14 | |
| 398 | Importing the FormsModule | 02:23 | |
| 399 | Registering a new Form | 04:05 | |
| 400 | Two-way Binding | 06:39 | |
| 401 | Template Variables | 05:47 | |
| 402 | Attribute Validation | 03:25 | |
| 403 | Handling Error Messages | 03:41 | |
| 404 | Preparing the Password Field | 04:14 | |
| 405 | Handling Form Submission | 04:50 | |
| 406 | Exercise: Imposter Syndrome | 02:56 | |
| 407 | Introduction to RxJS | 06:03 | |
| 408 | Observables | 05:22 | |
| 409 | Observers | 04:21 | |
| 410 | Pushing Asynchronous Values | 03:40 | |
| 411 | Unsubscribing from Observables | 03:34 | |
| 412 | Declarative Programming with Operators | 05:48 | |
| 413 | Timing Operators | 05:26 | |
| 414 | DOM Event Operators | 02:16 | |
| 415 | The of and from operators | 05:54 | |
| 416 | Understanding Pipeable Operators | 04:03 | |
| 417 | The Map Operator | 04:05 | |
| 418 | Marble Diagram | 02:44 | |
| 419 | Filter Operator | 07:27 | |
| 420 | Reduce Operator | 04:04 | |
| 421 | Take Operator | 04:17 | |
| 422 | Tap Operator | 03:27 | |
| 423 | Understanding Flattening Operators | 07:02 | |
| 424 | mergeMap Operator | 06:15 | |
| 425 | switchMap Operator | 04:42 | |
| 426 | concatMap Operator | 02:29 | |
| 427 | exhaustMap Operator | 02:32 | |
| 428 | Flattening Operators Recap | 02:22 | |
| 429 | Setting up Firebase | 07:09 | |
| 430 | Reviewing the Rules | 06:15 | |
| 431 | Installing AngularFire | 03:58 | |
| 432 | Importing AngularFire | 06:59 | |
| 433 | User Registration | 07:55 | |
| 434 | Handling the Response | 07:55 | |
| 435 | Buckets, Collections, and Documents | 03:18 | |
| 436 | Storing User Data | 06:33 | |
| 437 | Refactoring to a Service | 06:19 | |
| 438 | Interfaces vs. Classes | 07:51 | |
| 439 | Collection Types | 06:21 | |
| 440 | Connecting the User with their Data | 10:09 | |
| 441 | Database Rules | 02:40 | |
| 442 | Understanding Authentication | 04:14 | |
| 443 | Authentication after Registration | 03:20 | |
| 444 | The User Observable | 05:53 | |
| 445 | The Async Pipe | 07:38 | |
| 446 | Initializing Firebase First | 09:33 | |
| 447 | Setting up the Login | 09:26 | |
| 448 | Destroying the Modal | 06:08 | |
| 449 | The Delay Operator | 04:06 | |
| 450 | Signing Out | 04:27 | |
| 451 | Sidebar: JSON Web Tokens | 09:32 | |
| 452 | Creating a Validator Class | 03:57 | |
| 453 | Static Methods | 03:19 | |
| 454 | Validating Passwords | 06:13 | |
| 455 | Factory Functions | 06:16 | |
| 456 | Handling Errors | 06:04 | |
| 457 | Creating an Asynchronous Validator | 05:27 | |
| 458 | Validating Unique Emails | 05:25 | |
| 459 | Finalizing the Validator | 07:28 | |
| 460 | Understanding Routing | 05:29 | |
| 461 | Configuring the Router | 05:50 | |
| 462 | Registering Routes | 07:01 | |
| 463 | Exercise: Registering a Route | 03:40 | |
| 464 | Adding Navigation Links | 03:13 | |
| 465 | Active Links | 06:46 | |
| 466 | Generating a Routing Module | 05:57 | |
| 467 | Forcing Redirection | 04:41 | |
| 468 | A Quick Refactor | 03:29 | |
| 469 | Adding Route Data | 05:25 | |
| 470 | Filtering Router Events | 04:35 | |
| 471 | Retrieving Data Outside of the Outlet | 07:43 | |
| 472 | Exercise: Registering a Route with Data | 04:37 | |
| 473 | Route Parameters | 06:53 | |
| 474 | Subscribing to Route Parameters | 04:36 | |
| 475 | Query Parameters | 09:25 | |
| 476 | Learning More About Query Parameters | 08:43 | |
| 477 | Selecting an Option | 01:48 | |
| 478 | Wildcard Routes | 05:07 | |
| 479 | Updating Routes | 03:50 | |
| 480 | Route Guards | 05:52 | |
| 481 | Understanding File Uploads | 03:25 | |
| 482 | Blocking Events with Directives | 09:02 | |
| 483 | Handling Drag and Drop Events | 07:10 | |
| 484 | Handling Files | 07:54 | |
| 485 | Multi Step Form | 04:30 | |
| 486 | The Upload Form | 09:13 | |
| 487 | Uploading Files with Firebase | 06:55 | |
| 488 | Firebase Rules and Validation | 07:24 | |
| 489 | Adding an Alert Component | 05:16 | |
| 490 | Upload Progress Observable | 03:47 | |
| 491 | Handling Errors and Successful Uploads | 10:23 | |
| 492 | Storing the File Data | 08:29 | |
| 493 | Adding the File Data to the Database | 08:13 | |
| 494 | Firebase References and Snapshots | 02:23 | |
| 495 | Disabling Forms | 02:48 | |
| 496 | Fallback Upload | 06:18 | |
| 497 | Canceling Uploads | 05:47 | |
| 498 | Redirection after Upload | 06:25 | |
| 499 | Storing a Timestamp | 04:39 | |
| 500 | Querying the Database | 08:54 | |
| 501 | Storing the List of Clips | 07:21 | |
| 502 | Displaying the List of Clips | 02:13 | |
| 503 | Preparing the Form | 07:06 | |
| 504 | Passing on the Clip Data | 03:28 | |
| 505 | Binding the Edit Form | 06:33 | |
| 506 | Updating Clips | 09:18 | |
| 507 | Updating the List of Clips | 07:00 | |
| 508 | Deleting a Clip from the Storage/Database | 10:02 | |
| 509 | Sorting Clips with Behavior Subjects | 11:06 | |
| 510 | Composite Indexes | 04:32 | |
| 511 | What is WebAssembly? | 08:52 | |
| 512 | Getting Started with Rust | 06:18 | |
| 513 | Exploring the Starter Project | 06:47 | |
| 514 | Variables | 05:15 | |
| 515 | Data Types | 06:47 | |
| 516 | Debugging with Macros | 06:52 | |
| 517 | Control Flow | 04:39 | |
| 518 | Match Expressions | 07:49 | |
| 519 | Arrays | 02:50 | |
| 520 | Vectors | 05:19 | |
| 521 | Structures | 04:07 | |
| 522 | Ownership | 06:49 | |
| 523 | Results | 08:20 | |
| 524 | Preparing the Project | 03:41 | |
| 525 | Installing Webpack | 03:40 | |
| 526 | Configuring Webpack | 10:06 | |
| 527 | Reading Files | 08:10 | |
| 528 | Compiling Rust with Webpack | 04:48 | |
| 529 | Importing Web Assembly | 05:43 | |
| 530 | Logging Files | 09:15 | |
| 531 | Base64 Decoding | 03:07 | |
| 532 | Loading an Image from Memory | 03:22 | |
| 533 | Grayscaling an Image | 02:58 | |
| 534 | Buffering an Image | 04:20 | |
| 535 | Encoding an Image | 05:40 | |
| 536 | App Deployment | 04:06 | |
| 537 | Understanding FFmpeg | 02:45 | |
| 538 | Installing FFmpeg | 05:01 | |
| 539 | Custom Asset Paths | 05:26 | |
| 540 | Adding support for SharedArrayBuffer | 06:46 | |
| 541 | Loading FFmpeg with a Service | 04:12 | |
| 542 | Initializing FFMPeg | 06:47 | |
| 543 | Saving Files in Memory | 05:46 | |
| 544 | Generating a Screenshot | 11:01 | |
| 545 | Generating Multiple Screenshots | 05:10 | |
| 546 | Creating Screenshot URLs | 05:47 | |
| 547 | Bypassing Sanitization with Pipes | 08:25 | |
| 548 | Adding Feedback | 03:39 | |
| 549 | Selecting a Screenshot | 04:16 | |
| 550 | Updating the Firebase Storage Rules | 02:03 | |
| 551 | Uploading a Blob | 06:32 | |
| 552 | Recalculating the Upload Progress | 04:48 | |
| 553 | The forkJoin Operator | 07:23 | |
| 554 | Deleting Screenshots | 03:46 | |
| 555 | Section Overview | 01:44 | |
| 556 | Creating a List Component | 01:48 | |
| 557 | Handling Scroll Events | 07:41 | |
| 558 | Querying for Clips | 10:39 | |
| 559 | Rendering Clips on the Home page | 04:51 | |
| 560 | Understanding Cross Origin Issues | 03:44 | |
| 561 | Fixing Cross Origin Issues | 08:10 | |
| 562 | Fixing the Timestamp | 08:16 | |
| 563 | Rendering Clips on the Clip Page | 03:31 | |
| 564 | Installing Videojs | 01:38 | |
| 565 | Selecting elements with the ViewChild Decorator | 05:59 | |
| 566 | Initializing the Video Player | 02:03 | |
| 567 | Styles without View Encapsulation | 05:17 | |
| 568 | Tailwind’s Aspect Ratio Classes | 01:27 | |
| 569 | Resolving Data with a Guard | 08:10 | |
| 570 | Dynamically Rendering the Video | 07:03 | |
| 571 | Fixing the Manage Page | 01:04 | |
| 572 | Copying Links to the Clipboard | 06:05 | |
| 573 | Lazy Loading Modules | 06:32 | |
| 574 | Production Budgets | 03:27 | |
| 575 | Modifying Firebase Rules | 03:43 | |
| 576 | Deploying an App with Vercel | 10:45 | |
| 577 | Introduction to Testing | 11:21 | |
| 578 | Understanding Karma and Jasmine | 08:14 | |
| 579 | Preparing our App for Testing | 02:57 | |
| 580 | Writing a Sanity Test | 06:02 | |
| 581 | Angular’s Test Bed Utility | 05:56 | |
| 582 | Testing a Component’s Instance | 06:28 | |
| 583 | Querying the Component’s Template | 06:40 | |
| 584 | Inverting Matchers | 03:11 | |
| 585 | Testing Nested Components | 04:42 | |
| 586 | Testing Content Projection | 06:25 | |
| 587 | Custom Matcher Error Messages | 02:31 | |
| 588 | Mocking Services | 06:33 | |
| 589 | Overriding a Dependency | 02:45 | |
| 590 | Importing the Router Testing Module | 02:00 | |
| 591 | Exercise: Testing the Logout Link | 03:06 | |
| 592 | Simulating DOM Events | 03:59 | |
| 593 | Installing Cypress | 06:10 | |
| 594 | Exploring Cypress | 06:05 | |
| 595 | Writing an E2E Sanity Test | 06:05 | |
| 596 | Testing the Video Player | 08:53 |
Get instant access to all 595 lessons in this course, plus thousands of other premium courses. One subscription, unlimited knowledge.
Learn more about subscriptionBooks
Recommended next
What courses are similar to Complete Angular Developer in 2025 Zero to Mastery?
-
Updated 2y agoReact, Angular, Node In-Depth Guide: Beginner to Pro
By: UdemyIf you are planning to start your career as a developer or you just want to improve your programming skills, then this course is right for you. Get all you need80h 1m -
FreeUpdated 2y agoThe Modern Angular Bootcamp [2020]
By: Udemy, Stephen GriderAngular has been under development by Google for nearly a full decade. It has one purpose: scale up to gracefully handle the largest and most complex web apps a45h 23m -
Updated 2y agoDesktop apps with Angular, Firestore and Electron
By: UdemyThis course takes you on a developer journey where you'll be building a complete desktop application that runs on any platform (Windows, Mac.11h 28m -
FreeUpdated 2y ago100 Angular Challenge
By: UdemyBuild 100 Components, Services, Directives, Pipes in Angular and Much More! We will master all Angular has to offer by building 100 re-usable.12h 23m5/5 -
Updated 2y agoAngular NgRx: Getting Started
By: PluralsightAt the core of state management in Angular is a thorough knowledge of the Redux pattern and the NgRx library. NgRx is a powerful library for organizing and mana4h 5m -
Updated 3y agoAngular and Golang: A Rapid Guide - Advanced
By: UdemyLearn how to create an Ambassador App using Angular and Golang. We will build 3 frontend apps Admin, Ambassador and Checkout and they will consume a big Golang9h 40m -
Updated 3y agoAngular Basics (v15)
By: Ultimate Courses (Todd Motto)Modern Angular best-practices and patterns from years of evolution. Scalable architecture, immutable data structures, state services and brand new Standalone Co8h 58m
More courses by Zero To Mastery
-
Updated 10mo agoComplete Web Developer in 2025: Zero to Mastery
Learn to code. Get hired. This is one of the most popular, highly rated coding bootcamps online. It's also the most moderen and up-to-date. Guaranteed. You'll g37h 3m5/5 -
ClassicComplete Next.js Developer in 2023: Zero to Mastery
Learn Next JS from industry experts using modern best practices. The only Next JS tutorial + projects course you need to learn Next JS, build enterprise-level R27h 12m5/5 -
ClassicComplete SQL + Databases Bootcamp: Zero to Mastery
With so many online resources available, it can be paralyzing not only figuring out where to start but more importantly which courses will actually teach you th24h 6m5/5 -
Updated 3y agoPower BI Bootcamp: Zero to Mastery
This Power BI Bootcamp will take you from absolute beginner in Power BI to being able to get hired as a confident and effective Business Intelligence Analyst. Y16h 55m -
Updated 3y agoBash Scripting: Learn Shell Scripting
Learn Bash Scripting from scratch, from an industry expert. You'll learn Shell Scripting fundamentals, master the command line, and get the practice.9h 38m -
Updated 3y agoChatGPT & Large Language Models (LLMs): A Practical Guide
Learn how ChatGPT actually works under the hood! This byte-sized course will get you up to speed on Large Language Models (LLMs) including topics like Prompt De58m5/5