Я создаю угловую библиотеку (версия 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-файл в угловую библиотеку.
Чтобы загрузить 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));