【问题标题】:How to use Jquery Query Builder in Angular如何在 Angular 中使用 Jquery Query Builder
【发布时间】:2026-01-11 16:05:01
【问题描述】:

在我的 angular-cli 项目中寻找使用 jQuery Query Builder 的方法。

首先我尝试使用插件laplasianin/angular-jqueryQueryBuilder,但我错过了如何将它实际导入到我的组件中的说明。我对 angular/typescript 非常陌生。

然后我通过安装构建器包自己尝试了它: npm install jQuery-QueryBuilder

我已经将它添加到我的组件中,就像 jQuery 一样。 这是生成的示例代码,基于following demo:

import {AfterViewInit, Component} from "@angular/core";
import * as jQuery from "jquery";
import "jQuery-QueryBuilder/dist/js/query-builder.standalone.js";
import "jQuery-QueryBuilder/dist/css/query-builder.default.css";

@Component({
    selector: 'app-query-builder',
    templateUrl: './query-builder.component.html',
    styleUrls: ['./query-builder.component.scss']
})
export class QueryBuilderComponent implements AfterViewInit{
    protected rules_basic = {
        condition: 'AND',
        rules: [{
            id: 'price',
            operator: 'less',
            value: 10.25
        }, {
            condition: 'OR',
            rules: [{
                id: 'category',
                operator: 'equal',
                value: 2
            }, {
                id: 'category',
                operator: 'equal',
                value: 1
            }]
        }]
    };

    ngAfterViewInit() {
        this.getQueryBuilder();
    }


    private getQueryBuilder() {
        // jQuery('#builder').html('appelsap');
        let queryBuilder = jQuery.fn.queryBuilder;
        jQuery('#builder').queryBuilder({
            plugins: ['bt-tooltip-errors'],

            filters: [{
                id: 'name',
                label: 'Name',
                type: 'string'
            }, {
                id: 'category',
                label: 'Category',
                type: 'integer',
                input: 'select',
                values: {
                    1: 'Books',
                    2: 'Movies',
                    3: 'Music',
                    4: 'Tools',
                    5: 'Goodies',
                    6: 'Clothes'
                },
                operators: ['equal', 'not_equal', 'in', 'not_in', 'is_null', 'is_not_null']
            }, {
                id: 'in_stock',
                label: 'In stock',
                type: 'integer',
                input: 'radio',
                values: {
                    1: 'Yes',
                    0: 'No'
                },
                operators: ['equal']
            }, {
                id: 'price',
                label: 'Price',
                type: 'double',
                validation: {
                    min: 0,
                    step: 0.01
                }
            }, {
                id: 'id',
                label: 'Identifier',
                type: 'string',
                placeholder: '____-____-____',
                operators: ['equal', 'not_equal'],
                validation: {
                    format: /^.{4}-.{4}-.{4}$/
                }
            }],

            rules: this.rules_basic
        });
    }
}

在这种情况下,应用程序编译并加载,但我得到以下错误作为回报 Cannot read property 'template' of undefined.

我不知道如何让这些工作。真的很想在这方面有所帮助。谢谢。

======= 编辑 如所问,这是完整的错误:

ERROR TypeError: Cannot read property 'template' of undefined
    at QueryBuilder.<anonymous> (query-builder.standalone.js:415)
    at Array.forEach (<anonymous>)
    at new QueryBuilder (query-builder.standalone.js:410)
    at jQuery.fn.init.$.fn.queryBuilder (query-builder.standalone.js:3934)
    at QueryBuilderComponent.webpackJsonp.../../../../../src/app/components/application/query-builder/query-builder.component.ts.QueryBuilderComponent.getQueryBuilder (query-builder.component.ts:40)
    at QueryBuilderComponent.webpackJsonp.../../../../../src/app/components/application/query-builder/query-builder.component.ts.QueryBuilderComponent.ngAfterViewInit (query-builder.component.ts:33)
    at callProviderLifecycles (core.es5.js:11269)
    at callElementProvidersLifecycles (core.es5.js:11244)
    at callLifecycleHooksChildrenFirst (core.es5.js:11228)
    at checkAndUpdateView (core.es5.js:12325)

======= 编辑 更新了代码以反映当前的使用情况。

【问题讨论】:

  • 你能发布整个错误代码吗?它说明了一些关于模板的内容,但您提供的代码中绝对没有template
  • jquery 仅在视图初始化后工作。因此在 ngAfterViewInit(){} 函数下运行代码
  • 我已经更新了上面的代码以反映我当前的课程。这包括使用ngAfterViewInit,其中也会出现模板错误。
  • 尝试了几个不同的钩子,错误仍然出现。我查看了应该保存哪些模板,似乎应该是包的src目录下的template.js的内容,但这感觉不对。

标签: javascript jquery angular typescript


【解决方案1】:

首先,laplasianin/angular-jqueryQueryBuilder 是一个 AngularJs (1) 库。

其次,如果您在 angular-cli.json 中设置此行,您将能够使其工作:

  "styles": [
    "../node_modules/bootstrap/dist/css/bootstrap.css",
    "../node_modules/jQuery-QueryBuilder/dist/css/query-builder.default.css",
    "styles.css"
  ],
  "scripts": [
    "../node_modules/jquery/dist/jquery.min.js",
    "../node_modules/bootstrap/dist/js/bootstrap.min.js",
    "../node_modules/jQuery-QueryBuilder/dist/js/query-builder.standalone.min.js"        
  ],

你的组件:

import { Component, AfterViewInit } from '@angular/core';

declare var $: any;

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {

 protected rules_basic = {
        condition: 'AND',
        rules: [{
            id: 'price',
            operator: 'less',
            value: 10.25
        }, {
            condition: 'OR',
            rules: [{
                id: 'category',
                operator: 'equal',
                value: 2
            }, {
                id: 'category',
                operator: 'equal',
                value: 1
            }]
        }]
    };

    ngAfterViewInit() {
        this.getQueryBuilder();
    }

    private getQueryBuilder() {
        $('#builder').queryBuilder({
            plugins: ['bt-tooltip-errors'],

            filters: [{
                id: 'name',
                label: 'Name',
                type: 'string'
            }, {
                id: 'category',
                label: 'Category',
                type: 'integer',
                input: 'select',
                values: {
                    1: 'Books',
                    2: 'Movies',
                    3: 'Music',
                    4: 'Tools',
                    5: 'Goodies',
                    6: 'Clothes'
                },
                operators: ['equal', 'not_equal', 'in', 'not_in', 'is_null', 'is_not_null']
            }, {
                id: 'in_stock',
                label: 'In stock',
                type: 'integer',
                input: 'radio',
                values: {
                    1: 'Yes',
                    0: 'No'
                },
                operators: ['equal']
            }, {
                id: 'price',
                label: 'Price',
                type: 'double',
                validation: {
                    min: 0,
                    step: 0.01
                }
            }, {
                id: 'id',
                label: 'Identifier',
                type: 'string',
                placeholder: '____-____-____',
                operators: ['equal', 'not_equal'],
                validation: {
                    format: /^.{4}-.{4}-.{4}$/
                }
            }],

            rules: this.rules_basic
        });
    }

}

别忘了:

  • npm install bootstrap --save
  • npm install jquery --save
  • npm install jQuery-QueryBuilder --save

不幸的是,您不会有任何自动完成功能,但它可以工作。

【讨论】:

  • 我目前从 window 引用 jquery 并在那里实例化插件。我会尝试你的代码,因为我觉得它更干净。将回应任何结果。谢谢!
  • 嗨,我想在 ang 6 或 Ang 7 中做同样的事情,请指点
  • 你好@transformer,我的回答通常适用于Angular 6/7。您还可以在angular.json 中找到scriptsstyles 部分。但是,如果您正在寻找没有特别需要 jqueryBuild 的表单构建,我认为使用 Formly 会更好:alligator.io/angular/formly
  • 对于已经添加 import * as $ from "jquery" 的人;在顶部然后您需要将其替换为 declare var $: any;对我来说,更换线路有效。