代码之家  ›  专栏  ›  技术社区  ›  Juan Bravo Roig

从数据库字段的值下拉列表

  •  2
  • Juan Bravo Roig  · 技术社区  · 7 年前

    我有一个与数据过滤相关的问题。我有一个谷歌驱动器表来存储数据,我想在下拉列表中显示此数据源的一个字段,以按此字段(国家)进行筛选。

    Field

    Dropdown filter

    问题是这个下拉过滤器只显示列表当前页面上出现的国家。例如,如果在第一页的下拉列表中出现一个国家(泰国),我将只看到泰国。

    example

    如果我们移到列表的第二页,我们还有两个国家(西班牙和葡萄牙),然后下拉列表将只显示西班牙和葡萄牙。 我真正想要的是一个下拉列表,显示所有国家,无论它们是否在当前页面上,但我不知道如何修复它。

    这是国家/地区选择器的配置:

    example4

    在帮助中,据说我们应该使用 @datasource.model.fields.COUNTRY.possibleValues , 但如果我将此参数用作选项,则选择器中不会显示任何内容。

    Appmaker Help

    我花了很多时间试图解决这个问题,但我没有找到解决方案,我想与您确认这是一个问题还是我做错了什么。。。

    你能帮帮我吗?

    1 回复  |  直到 7 年前
        1
  •  5
  •   Pavel Shkleinik    7 年前

    您对下拉列表和表使用相同的数据源 #distinct()#sort() 您正在筛选已加载到浏览器的项目(与存储在数据库中的整个数据集相反)。

    您需要为下拉列表提供一个单独的数据源。至少有三种方法可以做到这一点:

    可能的值

    您可以预定义 allowed values 为您的 Country 字段,并使用它们填充创建表单和表筛选中的下拉选项 @datasource.model.fields.Country.possibleValues 正如你在问题中提到的: Possible values

    为国家创建模型

    通过引入专门的 related model 对于国家/地区,您可以获得以下好处:

    • 标准化数据(不会多次存储同一个国家/地区)
    • 您将能够保持国家列表的整洁(根据当前的方法,有可能使用不同拼写的同一个国家,如“US”、“USA”、“United State”等)
    • 应用程序用户在创建新记录时,可以从下拉列表中选择所需的国家(而不是每次为所有新记录键入容易出错的国家)。
    • 您的下拉绑定将非常简单,如下所示:
    // for names
    @datasources.Countries.items..Names
    
    // for options
    @datasources.Countries.items.._key
    
    // for value
    @datasource.query.filters.Country._key._equals
    

    创建计算模型

    具有 Calculated Model 您可以从表中挤出独特的国家/地区值。您的服务器查询脚本可以如下所示:

    function getUniqueCountries_() {
      var consumptions = app.models.Consumption.newQuery().run();
      var countries = [];
    
      consumptions.reduce(function (allCountries, consumption) {
        if (!allCountries[consumption.Country]) {
          var country = app.models.CountryCalc.newRecord();
          country.Name = consumption.Country;
          countries.push(country);
          allCountries[consumption.Country] = true;
        }
      }, {});
    
      return countries;
    }
    

    然而,随着消费表的增长,它会给您带来巨大的性能开销。在这种情况下,我宁愿研究 Cloud SQL Calculated SQL model .

    注:

    我给出了一个相当宽泛的答案,也涵盖了类似的情况,即字段选项的数量可以是无限的(而不是有限的国家数量)。