4

I am trying to use jQuery and jsGrid with my Angular 6 project, and it won't compile unless I comment offending part of code, and then once when it is compiled I comment and it works, but it gives error anyway. I am using Angular 6 CLI, IDE is Visual Studio Code, all latest versions. VS highlights jQuery alias i.e. $ sign as a problem

Here is structure.directive.ts (I have to comment whole ngOnInit to start server, then uncomment it):

import { Directive, ElementRef, OnInit } from '@angular/core';

@Directive({
  selector: '[structure]'
})
export class StructureDirective implements OnInit {

  clients = [
    { "Name": "Otto Clay", "Age": 25, "Country": 1, "Address": "Ap #897-1459 Quam Avenue", "Married": false },
    { "Name": "Connor Johnston", "Age": 45, "Country": 2, "Address": "Ap #370-4647 Dis Av.", "Married": true },
    { "Name": "Lacey Hess", "Age": 29, "Country": 3, "Address": "Ap #365-8835 Integer St.", "Married": false },
    { "Name": "Timothy Henson", "Age": 56, "Country": 1, "Address": "911-5143 Luctus Ave", "Married": true },
    { "Name": "Ramona Benton", "Age": 32, "Country": 3, "Address": "Ap #614-689 Vehicula Street", "Married": false }
  ];

  countries = [
    { Name: "", Id: 0 },
    { Name: "United States", Id: 1 },
    { Name: "Canada", Id: 2 },
    { Name: "United Kingdom", Id: 3 }
  ];

  constructor(private elementRef: ElementRef) { }

  ngOnInit() {
    window.$(this.elementRef.nativeElement).jsGrid({
      width: "100%",
      height: "400px",

      inserting: true,
      editing: true,
      sorting: true,
      paging: true,

      data: this.clients,

      fields: [
        { name: "Name", type: "text", width: 150, validate: "required" },
        { name: "Age", type: "number", width: 50 },
        { name: "Address", type: "text", width: 200 },
        { name: "Country", type: "select", items: this.countries, valueField: "Id", textField: "Name" },
        { name: "Married", type: "checkbox", title: "Is Married", sorting: false },
        { type: "control" }
      ]
    })
  }
}

and here is index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Aug4</title>
  <base href="/">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">

  <link type="text/css" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jsgrid/1.5.3/jsgrid.min.css" />
  <link type="text/css" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jsgrid/1.5.3/jsgrid-theme.min.css" />

  <script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jsgrid/1.5.3/jsgrid.min.js"></script>
</head>
<body>
  <app-root>Loading...</app-root>
</body>
</html>

Error is:

Date: 2018-08-26T14:01:56.175Z - Hash: fb473e9c8d7de6bf4569 - Time: 224ms
4 unchanged chunks
chunk {main} main.js, main.js.map (main) 52.1 kB [initial] [rendered]
i 「wdm」: Compiled successfully.
ERROR in src/app/structure.directive.ts(26,12): error TS2339: Property '$' does not exist on type 'Window'.

How can I solve this?

2
  • 2
    I think you should import jQuery rather than accessing it from the window reference (see here). Commented Aug 26, 2018 at 14:15
  • Possible duplicate of: stackoverflow.com/questions/40732787/… - Another question is do you really need jquery when using angular, isn't the native Dom API enough? Your descision Commented Aug 26, 2018 at 14:17

2 Answers 2

7

This is a problem with the typescript types not with angular. Run this command

npm install @types/jquery --save-dev

or if you are using yarn:

yarn add @types/jquery

And then add this in a type declaration file aka somefile.d.ts

declare global {
  interface Window {
    $: JQueryStatic
   }
}

This approach only makes the types available! You still have to import jquery somewhere.

alternatively you could import jquery. This will include the library itself and the types.

import * as $ from "jquery"

and use it without the window prefix.

Sign up to request clarification or add additional context in comments.

Comments

0

For the reference here is what I did (thanks to the Patrick):

npm install @types/jquery

and then in component:

declare var $: any;
declare var jsGrid: any;

Otherwise, there will be same error for jsGrid.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.