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>
。.