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

如何不修改jQuery QueryBuilder源码实现Rule结构自定义扩展

无需修改源码的实现方案

你可以通过QueryBuilder原生提供的事件钩子和扩展机制实现需求,完全不需要改动核心源码:

1. 替代第2242行的属性注入逻辑

QueryBuilder的规则实例创建后会触发afterCreateRule事件,你可以在该事件中完成to_upper属性的绑定和同步:

$('#builder').queryBuilder({
  // 你的原有配置
  plugins: ['你的大小写转换插件名', 'sql-support']
}).on('afterCreateRule.queryBuilder', function(e, rule) {
  // 规则初始化时设置默认to_upper值
  if (rule.model?.filter) {
    rule.model.filter.to_upper = rule.model.get('to_upper') ?? false;
  }
  // 监听属性变更自动同步到filter
  rule.model.on('change:to_upper', function(model, value) {
    model.filter.to_upper = value;
  });
});

2. 替代sqlToRule部分的属性注入逻辑

QueryBuilder的changer:sqlToRule本身就是开放的修改钩子,你直接扩展该钩子即可注入自定义属性,不需要改核心代码:

$.fn.queryBuilder.extend({
  'changer:sqlToRule': function(rule, data) {
    rule.to_upper = data.to_upper ?? false;
    return rule;
  }
});

3. 补充SQL生成逻辑(可选,根据你的需求)

如果需要在生成SQL时自动应用大写转换,可以监听ruleToSQL事件实现:

$('#builder').on('ruleToSQL.queryBuilder', function(e, rule, sqlObj) {
  if (rule.to_upper) {
    // 替换字段和值为大写包裹格式
    sqlObj.sql = sqlObj.sql.replace(/^(\w+)\s*([=<>!]+)\s*(.+)$/, (_, field, op, val) => {
      return `UPPER(${field}) ${op} UPPER(${val})`;
    });
  }
});

4. 按钮交互逻辑

你的自定义按钮点击时直接修改规则模型的to_upper属性即可:

// 插件内部的按钮点击处理
$(document).on('click', '.to-upper-toggle-btn', function() {
  const rule = $(this).closest('.query-builder-rule').data('queryBuilderRule');
  const currentVal = rule.model.get('to_upper');
  rule.model.set('to_upper', !currentVal);
  // 自行处理按钮选中态切换
  $(this).toggleClass('active', !currentVal);
});

以上方案所有自定义属性会自动在规则导入导出、SQL序列化/反序列化流程中保留,完全不需要修改QueryBuilder核心的Rule结构定义。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:36:05