Как добавить внешний файл js в библиотеку angular 6

Я создаю угловую библиотеку (версия 6), которая основана на угловом материале, для которого мне нужно включить библиотеку hammer js.

Я знаю, что в angular 6 мы можем добавить внешнюю библиотеку js в angular.json под конфигурацию проекта. Но это не работает в случае вышеупомянутой библиотеки. Я попытался добавить внешнюю библиотеку следующим образом.

"my-library": {
  "root": "projects/my-library",
  "sourceRoot": "projects/my-library/src",
  "projectType": "library",
  "architect": {
    "build": {
      "builder": "@angular-devkit/build-ng-packagr:build",
      "options": {
        "tsConfig": "projects/my-library/tsconfig.lib.json",
        "project": "projects/my-library/ng-package.json",
        "scripts": [
          "../node_modules/hammerjs/hammer.min.js"
        ]
      }
    }
}

Но я получаю эту ошибку.

Проверка схемы не удалась из-за следующих ошибок: Путь к данным "" НЕ ДОЛЖЕН иметь дополнительные свойства (сценарии).

Пожалуйста, предложите, как правильно добавить внешний js-файл в угловую библиотеку.

25
задан ford04 5 September 2019 в 07:55
поделиться

1 ответ

Чтобы загрузить js файл внешне от активов

создают сервисный файл, добавляет файл к активам и пишет путь во множестве.

import { Injectable } from "@angular/core";


    declare var document: any;
    @Injectable({
        providedIn:'root'
    })
    export class ScriptService {
      private scripts: any = {};

      constructor() {
        ScriptConstant.forEach((script: any) => {
          this.scripts[script.name] = {
            loaded: false,
            src: script.src
          };
        });
      }

      load(...scripts: string[]) {
        var promises: any[] = [];
        scripts.forEach(script => promises.push(this.loadScript(script)));
        return Promise.all(promises);
      }
      loadAll() {
        var promises: any[] = [];
        ScriptConstant.forEach(script => {
          // promises.push(delay(1000));
          promises.push(this.loadScript(script.name));
        });
        return Promise.all(promises);
      }

      loadScript(name: string) {
        return new Promise((resolve, reject) => {
          //resolve if already loaded
          if (this.scripts[name].loaded) {
            resolve({ script: name, loaded: true, status: "Already Loaded" });
          } else {
            //load script
            let script = document.createElement("script");
            script.type = "text/javascript";
            script.src = this.scripts[name].src;
            if (script.readyState) {
              //IE
              script.onreadystatechange = () => {
                if (
                  script.readyState === "loaded" ||
                  script.readyState === "complete"
                ) {
                  script.onreadystatechange = null;
                  this.scripts[name].loaded = true;
                  resolve({ script: name, loaded: true, status: "Loaded" });
                }
              };
            } else {
              //Others
              script.onload = () => {
                this.scripts[name].loaded = true;
                resolve({ script: name, loaded: true, status: "Loaded" });
              };
            }
            script.onerror = (error: any) =>
              resolve({ script: name, loaded: false, status: "Loaded" });
            document.getElementsByTagName("body")[0].appendChild(script);
          }
        });
      }
    }

    interface Scripts {
        name: string;
        src: string;
      }
      export const ScriptConstant: Scripts[] = [
        { name: "multislider", src: "assets/js/multislider.js" },

      ];

Вводят этот ScriptService везде, где Вы нуждаетесь в нем и загружаете js, освобождает как это

this.script.load('multislider').then(data => {
    console.log('script loaded ', data);
}).catch(error => console.log(error));
0
ответ дан 28 November 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: