当前位置: 首页 > 面试题库 >

在Angular JS中使用CKEditor内容更新textarea值

岳阳文
2023-03-14
问题内容

我使用的是最新的CKEditor(标准版),根据这个问题,我实现了这样的角度指令,

var cmsPlus = angular.module('cmsPlus', []);

cmsPlus.directive('ckEditor', function() {
  return {
    require: '?ngModel',
    link: function(scope, elm, attr, ngModel) {
      var ck = CKEDITOR.replace(elm[0]);

      if (!ngModel) return;

      ck.on('pasteState', function() {
        scope.$apply(function() {
          ngModel.$setViewValue(ck.getData());
        });
      });

      ngModel.$render = function(value) {
        ck.setData(ngModel.$viewValue);
      };
    }
  };
});

当我在CKEditor GUI模式下键入某些内容时,它工作正常,这里我将键入的内容添加到textarea的ng-model中。

但是,当我切换到代码编辑器时,即使切换回GUI,也无法获取更新的内容。需要在图形模式下再次键入内容。

我的指令有什么问题?还是可以通过其他一些CKEditor事件扩展此指令?

我想为表单提交或其他添加更多事件。

演示在这里。


问题答案:

您的指令运行良好。

代码模式下 ,有一个名为 sourcearea*
的插件可控制CKEditor的行为。我看不到该插件的代码中发生任何事件来处理输入。当CKEditor返回 GUI模式 时,有两个事件可以用来捕获
。这些事件是 ariaWidgetdataReady

***

我已经更新了您的示例以使用 dataReady 事件,因此它在切换回时会更新文本区域。我也将 pasteState 事件 更改
change ,如Dan
Caragea所说,它是在4.2版中引入的。
可以在这里找到更新的小提琴

我发现的一种几乎解决方案是监听 关键 事件并更新模型。几乎就在那儿,因为似乎仅在按下旧键时才触发该事件。因此,最后一个键总是丢失。

var cmsPlus = angular.module('cmsPlus', []);

cmsPlus.directive('ckEditor', function() {
  return {
    require: '?ngModel',
    link: function(scope, elm, attr, ngModel) {
      var ck = CKEDITOR.replace(elm[0]);

      if (!ngModel) return;

      ck.on('instanceReady', function() {
        ck.setData(ngModel.$viewValue);
      });

      function updateModel() {
          scope.$apply(function() {
              ngModel.$setViewValue(ck.getData());
          });
      }

      ck.on('change', updateModel);
      ck.on('key', updateModel);
      ck.on('dataReady', updateModel);

      ngModel.$render = function(value) {
        ck.setData(ngModel.$viewValue);
      };
    }
  };
});

无论如何,也许您可​​以从中弄清楚如何解决最后一个关键问题。快到了!

编辑:更新小提琴链接到正确的版本



 类似资料:
  • 问题内容: 我正在编写一个应用程序,它是Angular和jQuery的一部分。我通过在iFrame中加载jQuery内容来分离它们。 在某个事件(例如,单击ng)时,我需要刷新iFrame。我的控制器包含以下代码: 而iFrame是: 问题答案: 正如Paulo Scardine所说,正确的方法是通过指令,因为您不应该使用控制器来操纵DOM。 这样的事情可以做: 然后可以这样使用: 和:

  • 问题内容: 我正在使用CKEditor。我使用页面方法使用ajax保存表单值。 但是CKEditor值的内容无法保存到表中。 我不回发页面。 我该怎么办? 问题答案: 首先,您应该在页面中包含ckeditor和jquery连接器脚本, 然后创建一个文本区域 将ckeditor附加到文本区域,在我的项目中,我使用如下代码: 提交时使用以下内容获取内容: 而已!:)

  • 我痛苦了3天。我正在使用兼容性库中的视图分页程序。我已经成功地让它显示了几个视图。我的问题是,当我交换视图时,不会在它的回收器视图中按片段更新数据。但当我关闭应用程序时,打开碎片会按回收器视图显示更新内容。我使用了所有方法,如setnotifydatachanged()和许多其他方法,但viewpager中的片段不更新内容。感谢所有的帮助,这是我的主要活动

  • 问题内容: 我的JTable有问题。我的JTable显示数据库的内容。一个数据库表具有名称类别。每个类别都显示在JComboBox中。如果单击类别,则应该更新表内容。 这是我的代码的简短摘要,因此可以更轻松地为我提供帮助。该代码应可运行: (TestClass-主要) (如果需要,则为TestTableModel-AbstractTableModel(您需要它来执行代码!) 使用此短代码,如果更改

  • 问题内容: 我是刚接触Angular的人,在拨打Ajax电话后被卡住了。注入DOM后,如何呈现/编译html内容,以便仍可以使用AngularJs函数。 由于后端的设置方式,我必须通过ajax($ http)获取内容。我正在制作没有jQuery的应用。我尝试了$ compile和$ apply,但是没有用。我在这里想念什么。 我在http://jsfiddle.net/rexonms/RB7FQ/

  • 问题内容: 这是我的plnkr:http ://plnkr.co/edit/n8cRXwIpHJw3jUpL8PX5?p=preview 您必须单击li元素,然后表格会出现。输入一个随机字符串,然后点击“添加通知”。代替textarea文本,您将得到未定义。 标记: JS部分: 返回“未定义”。我注意到当使用angular-ui的ui-if时,这不起作用。任何想法为什么这不起作用?如何解决? 问题