私は隔離されたスコープが必要なディレクティブを作成していますが、ngModelで親スコープにバインドしたいと思います。
ここで問題は、親のスコープ値が変更されていないことです。
マークアップ
<form name="myForm" ng-app="customControl">
<div ng-init="form.userContent"></div>
<div contenteditable name="myWidget" ng-model="form.userContent" required>Change me!</div>
<span ng-show="myForm.myWidget.$error.required">Required!</span>
<hr />
<textarea ng-model="form.userContent"></textarea>
</form>
JS
angular.module('customControl', []).directive('contenteditable', function() {
return {
restrict : 'A', // only activate on element attribute
require : '?ngModel', // get a hold of NgModelController
scope: {},
link : function(scope, element, attrs, ngModel) {
if (!ngModel)
return; // do nothing if no ng-model
// Specify how UI should be updated
ngModel.$render = function() {
element.html(ngModel.$viewValue || '');
};
// Listen for change events to enable binding
element.bind('blur keyup change', function() {
scope.$apply(read);
});
read(); // initialize
// Write data to the model
function read() {
ngModel.$setViewValue(element.html());
}
}
};
});
デモ:Fiddle。
私はディレクティブ
デモのために分離されたスコープを使用していない場合、これが正常に動作します:Fiddle。
は 'element.html(ngModel $ viewValueが...。)' element.html($ sce.getTrustedHtml(ngModel $べきではありません。 viewValue)..) 'これはng docsの例とほぼ同じですが、これはそうしないとxss保護を効果的にバイパスしていることがわかりました。 – cirrus
@arun隔離スコープが機能しない理由を説明できますか? – geckob
Re @cirrusのコメントでは、XSSを避けるために、何かが要素に配置されたときは、まず$ sanitize(つまりHTMLを信頼しない)で消さなければならないと思います。 element.html($ sanitize(ngModel。$ viewValue)) 'のようなものです。 – Soferio