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