3 回答
这里的问题是 TinyMCE 使用自己的<iframe>
来编辑文本内容并将它们写回您<textarea>
的特殊事件。难怪ng-maxlength
在这里不起作用。
为了达到您想要的效果,您需要检查编辑器内容本身,并在达到最大长度时禁止输入更多字符。
我设法让它工作!有必要在 AngularJS中禁用SCE模式:
angular.module('myApp', ['ui.tinymce'])
.config(['$sceProvider', function($sceProvider) {
$sceProvider.enabled(false);
}])
.controller('myCtrl', ['$scope', function($scope) {
// ...
}]);
!当心安全漏洞!
Strict Contextual Escaping ( SCE ) 是一种模式,其中 AngularJS 需要在某些上下文中进行绑定以产生一个标记为可安全用于该上下文的值。在禁用 SCE 的情况下,AngularJS 应用程序允许将任意 HTML 渲染到 . <div>
,并且渲染用户控制的输入会产生安全漏洞。
我相信您真正想要的是让 TinyMCE 指令计算可见字符的“长度”,而不是计算<textarea>
. TinyMCE 将把自己的 iFrame 注入到页面中,编辑器是该 iFrame 的一部分——它不是<textarea>
.
当您对 进行验证时,<textarea>
您是在要求 Angular 计算<textarea>
...中的字符,这对您来说将是一个问题。问题是标准指令只计算字符,因此是一个简单的(空)HTML 示例:
<p></p>
当实际上没有“可见”内容时,确实会被视为 7 个字符。我为另一个编辑器构建了一个自定义指令,我最终做的是.text()
对 HTML 使用 jQuery 的函数。这将删除所有 HTML 标记,并提供编辑器中实际文本字符数的近似值。这是指令中的部分代码:
var jStrippedString = jQuery(modelValue).text().trim();
return (maxlength < 0) || ngModelCtrl.$isEmpty(jStrippedString) || (jStrippedString.length <= maxlength);
我相信您会想要创建一个自定义 Attribute 指令,该指令允许您获取编辑器的模型数据并自己执行此验证,而不是简单地计算<textarea>
.