Wanna see something cool? Check out Angular Spotify 🎧

Hello, I'm Trung Vo

Web expert with 10 years of experience, Google Developer Expert in Angular, fosters web dev communities and speaks globally, based in Singapore.

 — Notion: Rounding to 2 Decimal Places
 — Adding "loading=lazy" to GIF files on my 7-year-old Gatsby blog (with ChatGPT assistance)
 — Angular v17’s View Transitions: Navigate in Elegance
 — Improving Website Performance with Browser-Level Image Lazy Loading (simply add loading="lazy")
 — Enhancing Cross-Document Navigation with the View Transitions API
 — Upgrading from Angular 15 to 17 in Nx Workspace: A Comprehensive Guide
 — How to change Visual Studio Code terminal font?
 — @next/bundle-analyzer throw error Module not found: Can't resolve child_process
 — Angular Material 15 Migration
 — Angular augmenting native elements
 — Upgrading from Angular 12 to 15 in Nx Workspace: A Comprehensive Guide
 — nx:run-commands output not colored
 — Prettier - prevent HTML closing tag > being placed on a new line?
 — zsh history not working after VSCode upgrade
 — The different between :focus and :focus-visible
 — Angular 13 upgrade - Error: Unknown keyword formatMinimum
 — ngIf - Store the conditional result in a variable
 — Common use cases and solutions for accessibility in Angular
 — Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)
 — /usr/local/bin/code: line 6: python: command not found
 — Multiple ng-content
 — My React Reading List
 — Slick - prevent layout shift for your slider
 — CSS div jumped when adding a border
 — Align React Material UI Dialog to the top instead of center
 — TypeScript - Property 'onerror' does not exist on type 'EventTarget'
 — TypeScript data structure: Stack
 — TypeScript data structure: Queue
 — TypeScript data structure: Singly linked list
 — Difference between: function Person(){}, var person = Person(), and var person = new Person()?
 — Warning: Can’t perform a React state update on an unmounted component
 — Angular - Set page title automatically!
 — Angular Singapore
 — A simple Spotify client built with Angular 11, Nx workspace, ngrx, TailwindCSS and ng-zorro
 — Nx Workspace structure for an application with NestJS and Angular
 — SVG fill color doesn't work with hex colors
 — TypeScript unknown vs any types
 — Convert Promise to Observable
 — Migrate Angular to ESLint
 — Capture picture from your Webcam in Angular
 — Observable for Angular Output
 — 10 Modern CSS layout and sizing techniques
 — Build an Angular component to display snow ❄️ effect
 — Disable a reactive form control using custom directive
 — Angular Jira Clone Part 08 - Create placeholder loading (like Facebook's cards loading)
 — Get the last items of an array using array.slice()
 — Angular Jira Clone Part 07 - Build a rich text editor
 — How to iterate over objects in TypeScript
 — How to copy an object from the Chrome inspector console as code
 — Use async functions instead of callbacks for asynchronous code
 — The different between type and interface in TypeScript
 — Angular Jira Clone Part 06 - Build a markdown text editor
 — Apply types to entire function expressions when possible
 — Angular Jira Clone Part 05 - Build an interactive drag and drop board
 — How to kill the process currently using a given port on Windows
 — Use VSCode Like a PRO
 — Angular Jira Clone Part 04 - Build an editable textbox
 — Angular Jira Clone Part 03 - Setup Akita state management
 — Angular Jira Clone Part 02 - Build the application layout with flex and TailwindCSS
 — Top-level await
 — Space Invaders game built with Phaser 3 and TypeScript
 — Super Expressive - Easy Peasy Regex Generating
 — A childhood memory Tetris game built with Angular 10 and Akita
 — Angular Jira Clone Part 01 - Create a new repository and set up a new Angular application with CLI
 — Angular Jira Clone Part 00 - Prerequisites
 — I built a Jira clone application with Angular 9, Akita and ng-zorro
 — A painful Gatsby v1 to v2 migration
 — How to configure TailwindCSS with Angular and why you should use it
 — NPM vs Bower vs Browserify vs Gulp vs Grunt vs Webpack
 — Migrating my blog from Github to Gitlab, and deploy to Netlify
 — What is JavaScript Closure?
 — Angular - Using Visitor design pattern with Typescript
 — Front end editorial style guide
 — Jekyll dark theme (minimal-mistake)
 — Understand and prevent the most common memory leaks in Angular application - Subscription unsubscribe
 — The different between [value] and [ngValue] when passing to select option
 — Lesson learn from Git branches
 — Convert C# class to TypeScript interface
 — JavaScript: Understanding the Weird Parts Notes
 — Angular CDK Drag/Drop List inside a table (not Material Table) - Handle rows distorting width
 — Angular async validator to validate an input field with a backend API
 — Angular - Correct singular/plural form of a noun using custom pipe or NgPlural
 — How to export a table or an array in Angular to Excel file (xlsx)
 — Limit the number of simultaneous ajax requests
 — Angular formArray/formGroup - Validate at least one checkbox was selected
 — Restrict null and undefined via Non-Nullable-Types in TypeScript
 — Error handling in JavaScript. Synchronous vs asynchronous code
 — TypeScript - Declare a function callback type
 — Angular [(ngModel)] and debounce
 — Casting a JSON object to a TypeScript class
 — Freeze screen in Chrome debugger / DevTools panel for inspect element that will disappear on hover/click
 — Angular render recursive view using *ngFor and ng-template
 — Skiing in Singapore - a coding diversion
 — npm - Check and update package if needed
 — CSS Layout - Horizontal & Vertical Align
 — How we handle time zone and locale at Zyllem
 — The myth of the Genius Programmer
 — Angular Tips: Avoiding unnecessary RxJS in vendor.ts
 — Analyze webpack bundle with source-map-explorer. Optimize moment.js
 — Uncaught TypeError: Cannot read property 'name' of undefined
 — The combination of debounce and throttle
 — Find a sequence to produce a number by adding 5 or multiplying by 3
 — 10k StackOverFlow
 — Integrate Angular 2+ and Webpack in an ASP.NET MVC 5 application
 — Spinning button onSubmit form with jQuery and ASP.NET MVC
 — JavaScript naming convention
 — Shrinking Navigation Bar When Scrolling Down - Bootstrap 3 Navigation & jQuery
 — ES6 in my daily life
 — My new blog