You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ionic Angular BMI应用:点击按钮跳转计算结果页实现问题

Ionic Angular BMI应用:结果页计算与展示实现方案

问题说明

基于最新版Ionic Angular开发BMI应用,已实现输入合法性校验、页面跳转及参数传递功能,当前需完成结果页(AusgabePage)的BMI计算与结果展示。应用流程:点击按钮获取体重(Gewicht)、身高(Körpergröße)数据→校验合法性→跳转至结果页→代入BMI公式计算并展示结果。

现有代码

输入页HTML

<ion-item>
  <ion-label>Gewicht</ion-label>
  <ion-input clearInput type="number" placeholder="kg" [(ngModel)]="eingabeKG" min="1" onkeypress="return (event.charCode !=8 && event.charCode ==1 || (event.charCode >= 48 && event.charCode <= 57))"></ion-input>
</ion-item>

<ion-item>
  <ion-label>Körpergröße</ion-label>
  <ion-input clearInput type="number" placeholder="cm" [(ngModel)]="eingabeCM" min="1" onkeypress="return (event.charCode !=8 && event.charCode ==1 || (event.charCode >= 48 && event.charCode <= 57))"></ion-input>

</ion-item>
<ion-button expand="block" (click)="onBerechnenButton()">Umrechnen</ion-button>
</ion-content>

HomePage.ts

export class HomePage {

public eingabeKG = null;
public eingabeCM = null;

  constructor( private alertCtrl: AlertController,
    private navCtrl  : NavController) {
    
    }
async onBerechnenButton() {
if (this.eingabeKG == null && this.eingabeCM == null) {

  this.zeigeFehlerDialog("Bitte Gewicht und Körpergröße eingeben!");
  return;
  } else
  this.navCtrl.navigateForward(['/ausgabe']);

let navigationTarget = `/ausgabe?eingabeKG=${this.eingabeKG}&eingabeCM=${this.eingabeCM}`;
  this.navCtrl.navigateForward(navigationTarget);

async zeigeFehlerDialog(nachricht: string) {

  const meinAlert =
        await this.alertCtrl.create({ header  : "Fehler",
                                      message : nachricht,
                                      buttons : [ "Ok" ]
                                    });
  await meinAlert.present();
}
}

AusgabePage.ts

export class AusgabePage {

public eingabeKG: string;
public eingabeCM: string;

  constructor(private activatedRoute: ActivatedRoute) { 

  this.eingabeKG = activatedRoute.snapshot.queryParamMap.get( "eingabeKG" )!;
  this.eingabeCM = activatedRoute.snapshot.queryParamMap.get( "eingabeCM" )!;
  }
}

结果页HTML

<ion-content>
  <ion-text>
<p>
  {{eingabeKG}} {{eingabeCM}}
</p>
    
  </ion-text>
</ion-content>

解决方案

1. 修复HomePage.ts的跳转与校验逻辑

原代码存在重复跳转调用,且校验逻辑不完整,修改后代码如下:

export class HomePage {
  public eingabeKG: number | null = null;
  public eingabeCM: number | null = null;

  constructor(
    private alertCtrl: AlertController,
    private navCtrl: NavController
  ) {}

  async onBerechnenButton() {
    // 完善校验:任意参数为空都提示
    if (!this.eingabeKG || !this.eingabeCM) {
      this.zeigeFehlerDialog("Bitte Gewicht und Körpergröße eingeben!");
      return;
    }
    // 仅保留一次跳转,传递参数
    const navigationTarget = `/ausgabe?eingabeKG=${this.eingabeKG}&eingabeCM=${this.eingabeCM}`;
    this.navCtrl.navigateForward(navigationTarget);
  }

  async zeigeFehlerDialog(nachricht: string) {
    const meinAlert = await this.alertCtrl.create({
      header: "Fehler",
      message: nachricht,
      buttons: ["Ok"],
    });
    await meinAlert.present();
  }
}

2. 在AusgabePage.ts中实现BMI计算

将字符串参数转为数字,计算BMI值并添加分类判断:

import { ActivatedRoute } from '@angular/router';
import { Component } from '@angular/core';

@Component({
  selector: 'app-ausgabe',
  templateUrl: './ausgabe.page.html',
  styleUrls: ['./ausgabe.page.scss'],
})
export class AusgabePage {
  public eingabeKG: number;
  public eingabeCM: number;
  public bmiWert: number | null = null;
  public bmiKategorie: string = '';

  constructor(private activatedRoute: ActivatedRoute) {
    // 将字符串参数转为数字
    this.eingabeKG = Number(activatedRoute.snapshot.queryParamMap.get("eingabeKG"));
    this.eingabeCM = Number(activatedRoute.snapshot.queryParamMap.get("eingabeCM"));
    // 计算BMI
    this.berechneBMI();
  }

  private berechneBMI(): void {
    if (this.eingabeKG && this.eingabeCM) {
      // 身高转米:cm / 100
      const groesseInM = this.eingabeCM / 100;
      // BMI公式:体重(kg) / (身高(m))²,保留两位小数
      this.bmiWert = Number((this.eingabeKG / (groesseInM * groesseInM)).toFixed(2));
      // 判断BMI分类
      this.bestimmeBMIKategorie();
    }
  }

  private bestimmeBMIKategorie(): void {
    if (!this.bmiWert) return;
    if (this.bmiWert < 18.5) {
      this.bmiKategorie = "Untergewicht";
    } else if (this.bmiWert >= 18.5 && this.bmiWert < 25) {
      this.bmiKategorie = "Normalgewicht";
    } else if (this.bmiWert >= 25 && this.bmiWert < 30) {
      this.bmiKategorie = "Übergewicht";
    } else {
      this.bmiKategorie = "Adipositas";
    }
  }
}

3. 结果页HTML展示BMI结果与分类

修改结果页HTML,展示完整的BMI信息:

<ion-content class="ion-padding">
  <ion-text>
    <h2>Ihr BMI-Ergebnis</h2>
    <p>Gewicht: {{eingabeKG}} kg</p>
    <p>Körpergröße: {{eingabeCM}} cm</p>
    <p class="bmi-wert">BMI: {{bmiWert}}</p>
    <p class="bmi-kategorie">Kategorie: {{bmiKategorie}}</p>
  </ion-text>
</ion-content>

可选:添加样式优化展示效果(ausgabe.page.scss)

.bmi-wert {
  font-size: 1.5rem;
  font-weight: bold;
  margin: 1rem 0;
}

.bmi-kategorie {
  font-size: 1.2rem;
  color: #2c3e50;
}

内容的提问来源于stack exchange,提问作者Ksunit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:05:22