该帖子是关于ng2-ckeditor@1.1.13的,载有ckeditor@4.8.0 .
虽然有一些关于SO的文章有这个问题,但我相信这仍然是一个悬而未决的问题 . 请不要将此帖子标记为重复 .
复制问题:1)使用 ckeditor 指令实例化DOM元素 . 2)远离视图导航,以便托管 ckeditor 的Angular组件被销毁 . 你在Javascript控制台中得到这个:
ckeditor.js:19 [CKEDITOR] Error code: editor-destroy-iframe.
除非我错过了,否则github上有一个closed bug没有明显或可接受的解决方案 . 如果有解决方案,我们应该在这篇文章中记录它,因为它不完整或模糊不清 .
问题显然是Angular框架在 ckeditor 本身被破坏之前会破坏 iframe 元素 . 这会导致诊断消息 .
一个建议的解决方案涉及使用名为 divarea 的插件 . 根据我的理解,这将 iframe 替换为 div 元素 . 这有问题的原因是托管页面中的CSS元素将与CKEDITOR使用的CSS混合在一起 .
另一个提议的解决方案涉及以下代码片段:
for (name in CKEDITOR.instances) {
CKEDITOR.instances[name].destroy(true);
}
这个SO posting提到了这一点,并询问可以插入此代码的位置 . 没有Angular生命周期事件似乎有效 . 即使它确实这样做也不是一个可接受的解决方案,因为它会破坏所有CKEDITOR实例,并且在我的应用程序中,页面上可能存在多个可能在路由器事件中存活的情况 .
沿着这些路线,我发现我可以通过这些步骤在Angular Component中找到“my”CKEDITOR实例 . 在模板中:
<ckeditor id="content"
#editor
[(ngModel)]="editorContent"
[config]="{}"
debounce="500"
name="content"
></ckeditor>
除了 Build 局部变量的 #editor 指令外,这是标准的 . 然后在组件中,您可以构建一个这样的方法:
declare const CKEDITOR: any;
@Component() ....
@ViewChild('editor') ckeditor: CKEditorComponent;
destroyEditor() {
var name = this.ckeditor.instance.name;
CKEDITOR.instances[name].destroy(true);
}
所以问题是:在哪里调用 destroyEditor 函数? (其他问题是 destroy(true) 方法是否是正确的方法 . )
从 ngOnDestroy 调用它不起作用 . 从路由器捕获事件也没有奏效 . 还有其他建议吗?
1 回答
我正在使用Angular 6,这就是我所做的 .
我以编程方式使用它来销毁iFrame
Please Note: 我不想让任何编辑在场,所以我把它们全部摧毁了 . 需要注意的是,如果用户正在导航,并且返回CKEDITOR,则会创建一个新实例 . (editor2 ... 3 ... 4 ... 5等)我不关心实例int所以我将它们全部销毁并让angular根据用户交互创建新实例 .
这将允许您在任何退出条件下销毁iframe . 当用户离开编辑器时,我在设置更改UI视图的值并完成离开编辑器的导航之前调用此权限 .
它会留下一个文本区域 .
如果你正确计时,用户将看不到这一点 .
您将注意到此时您仍然在ckeditor.component.js的控制台中收到错误
这是您必须对库文件进行修改的地方 .
这是因为CKEditorComponent.prototype.ngOnDestroy函数中的if条件仅检查实例,而不是实例名称是否存在 .
即使实例已被销毁,实例似乎总是对我评估为true . (例如:editor1,editor2,editor3等)
当ngDestroy发生时,实例名称不存在...因为...您已将其销毁 .
在以下文件中进行此更改 .
这将专门检查实例名称而不是尝试销毁...因为..你已经销毁了它 .