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

Angular食谱搜索应用:复选框布尔值转API请求参数实现

解决方案

步骤1:在组件中添加筛选参数转换方法

在你的组件类里新增一个方法,负责把filter对象中值为true的属性转换成符合Edamam API要求的查询参数:

getFilterParams(): string {
  const params: string[] = [];
  // 遍历filter对象的所有属性
  Object.entries(this.filter).forEach(([key, value]) => {
    if (value) {
      // 把选中的属性转换为&dishType=xxx格式的参数
      params.push(`&dishType=${key}`);
    }
  });
  // 拼接所有参数,无选中项时返回空字符串
  return params.join('');
}

步骤2:修改组件的getRecipes函数,传入转换后的筛选参数

调用上面的方法生成筛选参数字符串,传给service的getRecipes方法:

getRecipes() {
  this.loadRecipes = true;
  this.recipeShow = false;
  // 生成筛选参数
  const filterParams = this.getFilterParams();
  this.recipeService
    .getRecipes(this.searchquery, filterParams)
    .subscribe((result) => {
      this.recipeShow = true;
      this.loadRecipes = false;
      let searchedWord = this.searchquery;
      let recipes = result.hits.map((data: any) => {
        let recipe = data.recipe;
        recipe.idref = data._links.self.href.slice(38, 70);
        return recipe;
      });
      
      this.allRecipes = recipes;
      this.word = searchedWord;
    });
}

步骤3:优化Service中的URL构建(可选但推荐)

手动拼接URL容易出现格式错误(比如无筛选条件时多余的&),推荐用Angular的HttpParams构建查询参数,更安全规范:

修改recipe.service.ts中的getRecipes方法:

import { HttpParams } from '@angular/common/http';

// ...

getRecipes(q: string, filter: string) {
  // 初始化基础参数
  let params = new HttpParams()
    .set('type', 'public')
    .set('q', q)
    .set('app_id', this.appid)
    .set('app_key', this.appkey)
    .append('field', 'label')
    .append('field', 'idref')
    .append('field', 'image')
    .append('field', 'ingredientLines')
    .append('field', 'yield')
    .append('field', 'shareAs')
    .append('field', 'totalTime')
    .append('field', 'healthLabels')
    .append('field', 'dietLabels')
    .append('field', 'mealType')
    .append('field', 'dishType')
    .append('field', 'cuisineType');

  // 处理筛选参数,添加到HttpParams中
  if (filter) {
    const filterItems = filter.slice(1).split('&');
    filterItems.forEach(item => {
      const [key, value] = item.split('=');
      params = params.append(key, value);
    });
  }

  // 构建完整请求URL
  const searchquery = `${this.urlConfig}?${params.toString()}`;
  return this.http.get<any>(searchquery, this.httpOptions);
}

如果坚持使用原手动拼接方式,直接保留现有代码即可——无筛选条件时filterParams为空字符串,不会影响URL格式。

补充说明

  • 若同时选中多个选项(比如starter和main),上述方法会自动生成&dishType=starter&dishType=main,符合Edamam API的多值参数传递规范。
  • 确保filter对象的键名和Edamam API的dishType有效值完全匹配(比如starter、main、dessert都是API接受的取值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:47:44