我正在创建一个包含 tinymce 4 编辑器的自定义 AngularJS 指令。当我尝试从一组其他 tinymce 编辑器中删除 tinymce 编辑器时,就会出现问题。请检查演示。这里尝试删除第一个或第二个编辑器,随后的编辑器损坏。
JS:
var app = angular.module('myApp', []);
app.controller('MainCtrl', function($scope) {
$scope.editors = [{}, {}, {}];
$scope.removeEditorByIndex = function (index) {
$scope.editors.splice(index, 1);
};
});
app.directive('myEditor', function () {
var uniqueId = 0;
return {
restrict: 'E',
require: 'ngModel',
scope: true,
template: '<textarea></textarea>',
link: function (scope, element, attrs, ngModel) {
var id = 'myEditor_' + uniqueId++;
element.find('textarea').attr('id', id);
tinymce.init({
selector: '#' + id
});
//where in AngularJS should I place the following lines?
//tinyMCE.execCommand('mceRemoveEditor', false, id);
//tinyMCE.execCommand('mceAddEditor', false, id);
}
}
});
HTML:
<div ng-app="myApp">
<div ng-controller="MainCtrl">
Try removing the first editor. You will see that next editors become unusable.
<div ng-repeat="editor in editors">
<button ng-click="removeEditorByIndex($index)">Remove editor #{{$index + 1}}</button>
<my-editor ng-model="text"></my-editor>
</div>
</div>
</div>
这样做的原因是,在从 中删除一个元素后$scope.editors
,angular 会删除每个后续编辑器并将其再次附加到已删除编辑器的位置(内部 angular 调用 jQuery .after()
)。和
在某些浏览器中保留 iframe 内容是不可能的,因为一旦从 dom 中删除节点,文档/窗口就会卸载
(取自这里)。
要修复损坏的编辑器,我应该调用:
tinyMCE.execCommand('mceRemoveEditor', false, id);
tinyMCE.execCommand('mceAddEditor', false, id);
(依次调用这两行就可以了)
我应该把这些重新初始化的行放在哪里?调用这些线条的适当角度方式是什么?
注意我也可能切换到不依赖 iframe 的 tinymce 编辑器的内联模式。但这会带来很大的不便:编辑器中的样式会与页面中的样式相交。因此这个选项是不可接受的。