Skip to content

操作全局数据

本文介绍如何在表单中使用 API 方法来操作全局数据源、全局变量和调用全局事件。这些 API 方法让您可以在运行时动态地获取、修改和触发全局数据,实现更灵活的表单交互。

获取 API

在使用全局数据 API 之前,您需要先获取 API 对象。API 对象可以通过事件、验证函数、钩子函数等方式获取。

详细说明请查看:如何获取 API

API 方法类型定义

ts
// 触发全局事件
type emitGlobalData = (id: string, ...args: any[]) => any;

// 修改全局变量
type setGlobalVar = (id: string, val: any) => any;

// 修改全局数据源
type setGlobalData = (id: string, val: any) => any;

// 获取数据(包括全局变量)
type getData = (id: string, default?: any) => any;

// 获取全局数据源(返回 Promise)
type getGlobalData = (id: string) => Promise<any>;

调用全局事件

通过 api.emitGlobalData 方法可以触发已定义的全局事件。全局事件通常用于执行一些通用的业务逻辑,如数据同步、状态更新等。

基本用法

js
// 在事件中触发全局事件
function handleClick($inject) {
  const api = $inject.api;

  // 触发全局事件,传入事件 ID 和参数
  api.emitGlobalData('event_Feq4lui56zxbabc', '参数1', '参数2');
}

使用示例

1. 在按钮点击事件中触发全局事件

js
{
  type: 'button',
  field: 'syncBtn',
  title: '同步数据',
  on: {
    click: function($inject) {
      const api = $inject.api;

      // 触发数据同步全局事件
      api.emitGlobalData('event_syncData', {
        formData: api.formData(),
        timestamp: Date.now()
      });
    }
  }
}

2. 在表单提交时触发多个全局事件

js
{
  type: 'button',
  field: 'submitBtn',
  title: '提交',
  on: {
    click: async function($inject) {
      const api = $inject.api;

      // 验证表单
      const valid = await api.validate();
      if (!valid) {
        return;
      }

      // 触发提交前事件
      api.emitGlobalData('event_beforeSubmit', api.formData());

      // 执行提交逻辑
      try {
        await api.fetch({
          action: '/api/submit',
          method: 'POST',
          data: api.formData()
        });

        // 触发提交成功事件
        api.emitGlobalData('event_submitSuccess');
      } catch (error) {
        // 触发提交失败事件
        api.emitGlobalData('event_submitError', error);
      }
    }
  }
}

操作全局变量

全局变量是可以在表单中动态计算和使用的变量。通过 api.setGlobalVar 可以修改全局变量的值,通过 api.getData('$var.xxx') 可以获取全局变量的值。

获取全局变量

js
// 在事件中获取全局变量
function handleClick($inject) {
  const api = $inject.api;

  // 获取全局变量的值
  const token = api.getData('$var.var_Fppdlz6gytmzb1c');
  console.log('Token:', token);
}

修改全局变量

重要警告

使用 api.setGlobalVar 修改全局变量会覆盖原来的计算特性。

一旦通过 api.setGlobalVar 设置了全局变量的值,该变量将不再使用原有的 handle 函数进行计算,而是直接使用设置的值。这意味着:

  • 原有的计算逻辑将失效
  • 变量将变为静态值,不再响应依赖数据的变化
  • 如果需要恢复计算特性,需要重新设置全局变量配置

建议:仅在确实需要覆盖计算逻辑时使用 api.setGlobalVar,否则应通过修改全局变量的依赖数据来触发重新计算。

js
// 在事件中修改全局变量
function handleChange($inject) {
  const api = $inject.api;

  // 修改全局变量的值(会覆盖计算特性)
  api.setGlobalVar('var_Fppdlz6gytmzb1c', '新的值');

  // 等同于
  api.setData('$var.var_Fppdlz6gytmzb1c', '新的值');
}

使用示例

1. 根据表单数据动态更新全局变量

js
{
  type: 'input',
  field: 'username',
  title: '用户名',
  on: {
    change: function($inject) {
      const api = $inject.api;
      const username = api.getValue('username');

      // 更新全局变量
      api.setGlobalVar('var_username', username);

      // 触发相关事件
      api.emitGlobalData('event_usernameChanged', username);
    }
  }
}

2. 在验证函数中使用全局变量

js
{
  type: 'input',
  field: 'amount',
  title: '金额',
  validate: [
    {
      required: true,
      message: '请输入金额'
    },
    {
      validator: function(val) {
        const api = this.api;

        // 获取最大金额限制(全局变量)
        const maxAmount = api.getData('$var.var_maxAmount', 10000);

        if (val > maxAmount) {
          return `金额不能超过 ${maxAmount}`;
        }

        return true;
      }
    }
  ]
}

操作全局数据源

全局数据源可以是静态数据或远程接口数据。通过 api.setGlobalData 可以修改全局数据源,通过 api.getGlobalData 可以获取全局数据源(返回 Promise)。

获取全局数据源

js
// 在事件中获取全局数据源(异步)
async function handleLoad($inject) {
  const api = $inject.api;

  // 获取全局数据源(返回 Promise)
  try {
    const data = await api.getGlobalData('data_Fk6dlui4k0xuabc');
    console.log('数据源:', data);
  } catch (error) {
    console.error('获取数据源失败:', error);
  }
}

修改全局数据源

js
// 在事件中修改全局数据源
function handleUpdate($inject) {
  const api = $inject.api;

  // 修改全局数据源
  api.setGlobalData('data_Fk6dlui4k0xuabc', [1, 2, 3, 4, 5]);

  // 等同于
  api.setData('$globalData.data_Fk6dlui4k0xuabc', [1, 2, 3, 4, 5]);
}

使用示例

1. 动态更新静态数据源

js
{
  type: 'select',
  field: 'category',
  title: '分类',
  props: {
    options: []
  },
  on: {
    mounted: async function($inject) {
      const api = $inject.api;

      // 获取全局数据源
      const categories = await api.getGlobalData('data_categories');

      // 更新选项
      api.updateRule($inject.rule.id, {
        props: {
          options: categories
        }
      });
    }
  }
}

2. 在级联选择中使用全局数据源

js
{
  type: 'select',
  field: 'province',
  title: '省份',
  props: {
    options: []
  },
  on: {
    mounted: async function($inject) {
      const api = $inject.api;

      // 获取省份数据
      const provinces = await api.getGlobalData('data_provinces');
      api.updateRule($inject.rule.id, {
        props: { options: provinces }
      });
    },
    change: async function($inject) {
      const api = $inject.api;
      const provinceId = api.getValue('province');

      if (provinceId) {
        // 获取城市数据
        const cities = await api.getGlobalData('data_cities');
        const filteredCities = cities.filter(city => city.provinceId === provinceId);

        // 更新城市选项
        const cityRule = api.getRule('city');
        if (cityRule) {
          api.updateRule(cityRule.id, {
            props: { options: filteredCities }
          });
        }
      }
    }
  }
}

注意事项

重要提示

  1. 全局数据源是异步的api.getGlobalData() 返回 Promise,必须使用 await.then() 来获取数据
  2. 数据覆盖:使用 api.setGlobalDataapi.setGlobalVar 修改数据后,原有的全局配置数据发生更新后将不会再生效,不会自动更新
  3. 事件参数api.emitGlobalData 可以传递多个参数,这些参数会传递给全局事件的处理函数