Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

No person shown after selecting ALL genders from a dropdown

The minimal code to produce the issue can be seen at here.

Objective: Showing a list of persons based on the selected gender. If All is selected then all persons are shown.

Issue:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

  • When the page is first loaded, All is selected by default. All persons are shown. It works as expected.

  • Selecting male shows a list of male persons. It works as expected.

  • But if I reselect All, no person is shown. It is the unexpected result.

enter image description here

Code Snippet:

<div>
  <select [(ngModel)]="selectedFilter">
    <option [value]="undefined">All</option>
    <option *ngFor="let gender of ['male','female']" [value]="gender">
      {{gender}}
    </option>
  </select>
  <ul>
    <li *ngFor="let person of peopleByGender">
      {{person.name}}
    </li>
  </ul>
</div>
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html'
})
export class AppComponent {
  selectedFilter?: "male" | "female";

  people: { name: string; gender: "male" | "female"; }[] = [
    { name: "Anton", gender: "male" },
    { name: "Bob", gender: "male" },
    { name: "Cindy", gender: "female" }
  ];


  get peopleByGender(): readonly { name: string; gender: "male" | "female"; }[] {
    return this.people
      .filter(x => this.selectedFilter == undefined || x.gender == this.selectedFilter);
  }

}

Question

What causes this issue? And how to solve it?

Note: Using type or interface are intentionally ignored to focus on the main issue.

Logging

get peopleByGender(): readonly { name: string; gender: "male" | "female"; }[] 
{
  console.log(

  `Selected Filter: ${this.selectedFilter}. 
   Is it undefined? ${this.selectedFilter == undefined}`

  );

 // ... others
}

enter image description here

>Solution :

<option> values must be convertible to strings, because behind the scenes they’re getting represented as HTML DOM.

DOM Representation

So when a user selects the "All" option, they’re not changing the value to undefined: they’re changing it to "undefined".

Instead of trying to use undefined, use a special string value. For example, you could use "All", or you could just use an empty string:

  <option value="">All</option>
export class AppComponent {
  selectedFilter: "male" | "female" | "" = "";

  people: { name: string; gender: "male" | "female"; }[] = [
    { name: "Anton", gender: "male" },
    { name: "Bob", gender: "male" },
    { name: "Cindy", gender: "female" }
  ];


  get peopleByGender(): readonly { name: string; gender: "male" | "female" | ""; }[] {
    return this.people
      .filter(x => this.selectedFilter === "" || x.gender == this.selectedFilter);
  }
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading