Tinymce 双向绑定 Angular 2/4
Tiny Mce Two way Binding with Angular 2/4
这是我的tinymce.component.ts
import {
Component,
OnDestroy,
AfterViewInit,
EventEmitter,
Input,
Output
} from '@angular/core';
@Component({
selector: 'simple-tiny',
template: `<textarea id="{{elementId}}"></textarea>`
})
export class SimpleTinyComponent implements AfterViewInit, OnDestroy {
@Input() elementId: String;
@Output() onEditorKeyup = new EventEmitter<any>();
editor;
ngAfterViewInit() {
tinymce.init({
selector: '#' + this.elementId,
plugins: ['link', 'paste', 'table'],
skin_url: 'assets/skins/lightgray',
setup: editor => {
this.editor = editor;
editor.on('keyup', () => {
const content = editor.getContent();
this.onEditorKeyup.emit(content);
});
},
});
}
ngOnDestroy() {
tinymce.remove(this.editor);
}
}
现在我正在使用它我的 html 现在我可以通过 keyupHandlerFunction
获取文本但我想要 2 方式绑定 ngModel
<simple-tiny
[elementId]="'my-editor-id'"
(onEditorKeyup)="keyupHandlerFunction($event)"
>
</simple-tiny>
此代码是 tinyMCE 建议的,但我想要 ngModel
这里
对于 2 种方式绑定我怎么能在这里做
喜欢:
<simple-tiny
[elementId]="'my-editor-id'"
(onEditorKeyup)="keyupHandlerFunction($event)"
[(ngModel)]="value">
</simple-tiny>
<p>{{ "My Model" + model}} </p>
您应该 ControlValueAccessor 像这样实现:
export const TINYMCE_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SimpleTinyComponent),
multi: true
};
@Component({
selector: 'simple-tiny',
template: `<textarea #textArea [value]="value"></textarea>`,
providers: [TINYMCE_VALUE_ACCESSOR]
})
export class SimpleTinyComponent implements AfterViewInit,
OnDestroy, ControlValueAccessor {
@Input() elementId: String;
@ViewChild('textArea') textArea: ElementRef;
editor: any;
value: string;
onChange = (_: any) => { };
constructor(private zone: NgZone) {}
writeValue(value: any): void {
this.value = value;
if (this.editor) {
this.editor.setContent(value || '');
}
}
ngAfterViewInit() {
tinymce.init({
target: this.textArea.nativeElement,
plugins: ['link', 'paste', 'table'],
setup: editor => {
this.editor = editor;
editor.on('keyup', () => {
const content = editor.getContent();
this.zone.run(() => this.onChange(content))
});
}
});
}
registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
registerOnTouched(fn: () => void): void { }
ngOnDestroy() {
tinymce.remove(this.editor);
}
}
这是我的tinymce.component.ts
import {
Component,
OnDestroy,
AfterViewInit,
EventEmitter,
Input,
Output
} from '@angular/core';
@Component({
selector: 'simple-tiny',
template: `<textarea id="{{elementId}}"></textarea>`
})
export class SimpleTinyComponent implements AfterViewInit, OnDestroy {
@Input() elementId: String;
@Output() onEditorKeyup = new EventEmitter<any>();
editor;
ngAfterViewInit() {
tinymce.init({
selector: '#' + this.elementId,
plugins: ['link', 'paste', 'table'],
skin_url: 'assets/skins/lightgray',
setup: editor => {
this.editor = editor;
editor.on('keyup', () => {
const content = editor.getContent();
this.onEditorKeyup.emit(content);
});
},
});
}
ngOnDestroy() {
tinymce.remove(this.editor);
}
}
现在我正在使用它我的 html 现在我可以通过 keyupHandlerFunction
获取文本但我想要 2 方式绑定 ngModel
<simple-tiny
[elementId]="'my-editor-id'"
(onEditorKeyup)="keyupHandlerFunction($event)"
>
</simple-tiny>
此代码是 tinyMCE 建议的,但我想要 ngModel
这里
对于 2 种方式绑定我怎么能在这里做
喜欢:
<simple-tiny
[elementId]="'my-editor-id'"
(onEditorKeyup)="keyupHandlerFunction($event)"
[(ngModel)]="value">
</simple-tiny>
<p>{{ "My Model" + model}} </p>
您应该 ControlValueAccessor 像这样实现:
export const TINYMCE_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SimpleTinyComponent),
multi: true
};
@Component({
selector: 'simple-tiny',
template: `<textarea #textArea [value]="value"></textarea>`,
providers: [TINYMCE_VALUE_ACCESSOR]
})
export class SimpleTinyComponent implements AfterViewInit,
OnDestroy, ControlValueAccessor {
@Input() elementId: String;
@ViewChild('textArea') textArea: ElementRef;
editor: any;
value: string;
onChange = (_: any) => { };
constructor(private zone: NgZone) {}
writeValue(value: any): void {
this.value = value;
if (this.editor) {
this.editor.setContent(value || '');
}
}
ngAfterViewInit() {
tinymce.init({
target: this.textArea.nativeElement,
plugins: ['link', 'paste', 'table'],
setup: editor => {
this.editor = editor;
editor.on('keyup', () => {
const content = editor.getContent();
this.zone.run(() => this.onChange(content))
});
}
});
}
registerOnChange(fn: (_: any) => void): void { this.onChange = fn; }
registerOnTouched(fn: () => void): void { }
ngOnDestroy() {
tinymce.remove(this.editor);
}
}