Muirik
Muirik

Reputation: 6289

When I console.log a user's radio button selection, what logs is always one behind

For some reason, when I console.log a user's radio button selection, what logs to the console is always one behind. Why would this be? I have a default radio button selection set to "all" for the initial state. When a user click's "Option A" what logs to the console is the "all" from the initial state. When I click again, this time on "Option B", what logs is "Option A" from the previous selection. Why is it one off? How can I resolve this?

   public user: User;

  public categories = [
    { value: 'T', display: 'All', count: 232 },
    { value: 'A', display: 'Choice A', count: 22 },
    { value: 'B', display: 'Choice B', count: 43 },
    { value: 'C', display: 'Choice C', count: 35 },
    { value: 'D', display: 'Choice D', count: 62 },
    ];

  ngOnInit() {
    this.user = {
      category: this.categories[0].value
    }
  }

  select(isValid: boolean, f: User) {
    if (!isValid) return;
    console.log(f);
    console.log(this.user.category);
  }

And the HTML:

<form #f="ngForm" novalidate>
    <div class="form-group">
    <div class="radio" *ngFor="let category of categories">
        <label>
        <input type="radio" name="category" [(ngModel)]="user.category" [value]="category.value" (click)="select(f.value, f.valid)">
        {{category.display}}
        </label>
        <span class="num-results">{{category.count}}</span>
    </div>
    </div>
</form>

Upvotes: 3

Views: 430

Answers (1)

G&#252;nter Z&#246;chbauer
G&#252;nter Z&#246;chbauer

Reputation: 657366

Use ngModelChange instead of click

(ngModelChange)="select(f.value, f.valid)"

The (click) event is processed before ngModel had the chance to update the form.

The order of bindings on an element doesn't define in what order events are processed.

Upvotes: 3

Related Questions