Angular2: перезаписать команду img в ng2-ckeditor
У меня есть страница, на которой есть ckeditor. Я использую ng2-ckeditor и ngx-modal. Это мой шаблон:
<div>
<ckeditor
id="questionContent"
name="questionContent"
[(ngModel)]="question.content"
(change)="onChange($event)"
(ready)="onReady($event)"
(focus)="onFocus($event)"
(blur)="onBlur($event)" debounce="500">
</ckeditor>
</div>
....//Some stuff there
<!--Modal-->
<modal #uploadModal [closeOnEscape]="false" [closeOnOutsideClick]="false">
<modal-header>
<h4 class="modal-title pull-left">{{ 'QUESTIONS' | translate }}</h4>
</modal-header>
<modal-content>
<div class="drag-n-drop-container"
ngFileDrop
[options]="options"
(onUpload)="handleUpload($event)"
[ngClass]="{'file-over': hasBaseDropZoneOver}"
(onFileOver)="fileOverBase($event)">
<h1>Drag & Drop</h1>
<label class="upload-button">
<input type="file"
class="hidden"
ngFileSelect
[options]="options"
(onUpload)="handleUpload($event)">
Browse
</label>
</div>
</modal-content>
<modal-footer>
<button class="btn btn-default pull-right cancel" (click)="uploadModal.close()">
<i class="fa fa-times"></i>
{{ 'BUTTON_CLOSE' | translate }}</button>
</modal-footer>
</modal>
Моя ситуация заключается в попытке переписать изображение диалога ckeditor. Так что в моем компоненте я сделаю это:
import {
Component, OnInit, ViewChild, ViewChildren, AfterViewChecked,
AfterViewInit, Renderer, QueryList, ViewEncapsulation
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { Router, ActivatedRoute, Params } from '@angular/router';
import { Modal } from 'ngx-modal';
import { CKButtonDirective, CKEditorComponent } from 'ng2-ckeditor';
declare var CKEDITOR: any;
@Component({
selector: 'question-edit',
templateUrl: './question-edit.component.html',
styleUrls: [
'./question-edit.style.css'
],
encapsulation: ViewEncapsulation.None
})
export class EditQuestionComponent implements OnInit, AfterViewChecked, AfterViewInit {
@ViewChildren('answers') answerInputs: QueryList<any>;
@ViewChild('uploadModal') public uploadModal: Modal;
private editor: any;
constructor(private rd: Renderer) { }
ngOnInit() {
};
registerCKEditorCommands(editor: any, uploadModal: Modal) {
let self = this;
editor.addCommand("image", {
exec: self.onUploadImage
});
};
ngAfterViewInit() {
let self = this;
setTimeout(function () {
for (var instanceName in CKEDITOR.instances) {
self.editor = CKEDITOR.instances[instanceName];
self.editor.on("instanceReady", function (ev: any) {
let _editor = ev.editor;
self.registerCKEditorCommands(_editor, self.uploadModal);
});
}
});
};
onUploadImage(editor: any) {
this.uploadModal.open();
};
}
Все работает нормально, кроме тех случаев, когда я нажимаю кнопку изображения на панели инструментов ckeditor. Это вызовет функцию onUploadImage()
но this.uploadModal
является undefined
, Если мы попытаемся распечатать this.uploadModal
в функции ngAfterViewInit()
это дает правильное значение, и мы можем открыть диалог там.
Как я могу обработать открытый диалог в функции onUploadImage
? Заранее спасибо.
1 ответ
Я думаю, что любой из этих вариантов должен работать для вас, потому что этот контекст будет ссылаться на ваш экземпляр компонента:
1) связать
а)
editor.addCommand("image", {
exec: this.onUploadImage.bind(this)
});
б)
export class EditQuestionComponent {
constructor() {
this.onUploadImage = this.onUploadImage.bind(this);
}
...
editor.addCommand("image", {
exec: this.onUploadImage
});
2) функция стрелки
editor.addCommand("image", {
exec: (editor) => this.onUploadImage(editor)
});
3) функция стрелка экземпляра
editor.addCommand("image", {
exec: this.onUploadImage
});
...
onUploadImage = (editor: any) => {
this.uploadModal.open();
};
Смотрите также