#angular #dropzone.js #angular-cli
#angular #dropzone.js #angular-cli
Вопрос:
итак, я использовал эту статью, чтобы получить Dropzone.js импортирован в мой проект Angular 2 с помощью Angular CLI. Хотя эта статья была опубликована чуть более 2 месяцев назад до этого вопроса, я заметил, что этот человек не использовал новый синтаксис Angular CLI с @NgModule.
Есть ли способ импортировать это Dropzone.js модуль npm в мой проект?
Мне удалось включить Dropzone.js файл в мое свойство «scripts» в angular-cli.json здесь:
"scripts": [
"../node_modules/dropzone/dist/dropzone.js"
],
Вот мой компонент dropzone:
import {
Component,
OnInit,
Input,
Output,
EventEmitter,
ElementRef
} from '@angular/core';
import {
Http
} from '@angular/http';
@Component({
selector: 'dropzone',
templateUrl: './dropzone.component.html',
styleUrls: ['./dropzone.component.scss']
})
export class DropzoneComponent implements OnInit {
private _dropzone: Dropzone;
@Input()
element: string = ".dropzoneArea";
@Input()
url: string = "file/post";
@Input()
uploadMultiple: boolean = false;
@Input()
maxFileSize: number = 2048;
@Input()
clickable: string = ".dropzoneArea";
@Input()
autoProcessQueue: boolean = true;
@Input()
addRemoveLinks: boolean = false;
@Input()
createImageThumbnails: boolean = false;
@Input()
previewTemplate: string = "<div style='display:none'></div>";
@Input()
acceptedFiles: string = "*";
@Output()
sending: EventEmitter < boolean > ;
@Output()
uploadprogress: EventEmitter < number > ;
@Output()
success: EventEmitter < any > ;
@Output()
error: EventEmitter < any > ;
constructor(private _eleRef: ElementRef, private _http: Http) {
this.sending = new EventEmitter < boolean > ();
this.uploadprogress = new EventEmitter < number > ();
this.success = new EventEmitter < any > ();
this.error = new EventEmitter < any > ();
}
initDropzone() {
this._http.get("api/getCsrf").subscribe(data => {
let body = data.json();
this._dropzone = new Dropzone(this.element, {
url: this.url,
uploadMultiple: this.uploadMultiple,
maxFilesize: this.maxFileSize,
clickable: this.clickable,
autoProcessQueue: this.autoProcessQueue,
addRemoveLinks: this.addRemoveLinks,
createImageThumbnails: this.createImageThumbnails,
previewTemplate: this.previewTemplate,
acceptedFiles: this.acceptedFiles,
params: {
_csrf: body._csrf
}
});
this._dropzone.on("sending", (file, xhr, formaData) => {
this.sending.emit(true);
});
this._dropzone.on("uploadprogress", (file, progress, bytesSent) => {
this.uploadprogress.emit(progress);
});
this._dropzone.on("success", (file) => {
this.success.emit(file);
});
this._dropzone.on("error", (file, message) => {
this.error.emit(message);
});
});
}
ngOnInit() {
this.initDropzone();
}
}
И вот ошибка, которую я получаю при загрузке своего приложения
client?93b6:76 [default] /projects/project/dropzone/dropzone.component.ts:79:33
Cannot find name 'Dropzone'.
У кого-нибудь есть какие-либо мысли по этому поводу? На самом деле я могу получить доступ к объекту Dropzone, поскольку он прикреплен к окну, но я не могу заставить свой компонент найти его.
Ответ №1:
TypeScript ничего не знает о файлах JS, поэтому, если у вас есть что-то глобальное, вам все равно нужно так или иначе сообщить об этом TypeScipt. Самым простым способом было бы просто объявить произвольную переменную
declare var Dropzone: any
Этого было бы достаточно для компиляции кода, поскольку TypeScript просто ищет имя Dropzone
. И потому, что мы вводим его в any
. на самом деле не важно, что мы делаем с этим символом впоследствии. Он просто признает, что мы знаем, что мы с ним делаем.
Однако при использовании библиотек JS с TypeScript более предпочтительно использовать файл определения TypeScript. Если библиотека не поддерживает TypeScript из коробки (не имеет собственного файла определения, включенного в библиотеку), для популярных библиотек, скорее всего, уже существует файл определения. Dropzone — одна из таких популярных библиотек.
npm install --save-dev @types/dropzone
Теперь вы можете импортировать ее везде, где вам это нужно
import Dropzone from 'dropzone'
Теперь вы должны получить строгую типизацию и intellisense. Обратите внимание, что для меня, используя VSCode, мне пришлось перезапустить IDE для запуска intellisense. Это не должно быть обязательным, это может быть ошибка VSCode.
Комментарии:
1. Привет, @peeskillet, спасибо за ответ. Когда я установил typings, я попытался
import Dropzone from 'dropzone' in @NgModule and it says the module can't be found. When I try
объявить var Dropzone: any` внутри моего компонента Dropzone, он избавляется от одной из ошибок Dropzone, но я все равно получаю эту:main.bundle.js:58546 [default] /Applications/MAMP/htdocs/ll-client-web/src/app/dropzone/dropzone.component.ts:13:23 Cannot find name 'Dropzone'.
2. Возможно, вам потребуется обновить ваш глобальный TypeScript до последней версии.
@types
поддержка не добавлена до TypeScript 2.0. Или, возможно, ваша среда IDE еще не поддерживает@types
. Попробуйте создать его из командной строки и посмотрите, не проблема ли это просто с IDE3. Боюсь, я не на 100% уверен, что вы имеете в виду. Как я могу проверить, какая версия Tyepscript у меня есть? Что я могу сделать, чтобы создать его из командной строки?
4. Чтобы проверить, просто сделайте
tsc -v
.tsc
является компилятором typescript, который поставляется с установкой npmtypescript
. Если это более ранняя версия, чем 2.0, просто установите новуюnpm install typescript -g
.. Я имел в виду создание вашего проекта. Если это просто проблема с IDE, то проект должен быть собран нормально, если у вас не установлена более старая версия typescript. Чтобы создать его, вы можете простоng build
илиng serve
5. А, ладно, я понял. Мне также нужно было перезапустить проект. Сумасшедший. Большое спасибо @peeskillet, ты потрясающий : D