Pourquoi est-ngModel.$setViewValue(...) pas de

Je suis en train d'écrire une directive qui a besoin d'un cas isolé, mais je veux le lier à la portée parent via ngModel.

Ici, le problème est que les parents de la portée de la valeur n'est pas modifiée.

Balisage

<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());
            }
        }
    };
});

Démo: Violon.

Cela fonctionne bien si je n'utilise pas un isolé champ d'application de la directive

Démo: Violon.

  • Ne devrait pas element.html(ngModel.$viewValue...)be element.html($sce.getTrustedHtml(ngModel.$viewValue)..) " je sais que c'est presque exactement la même que dans le ng docs exemple, mais je viens de découvrir cette contourne la protection xss autrement.
  • Pouvez-vous expliquer pourquoi l'isoler de la portée de faire, il ne fonctionne pas?
  • Re @cirrus commentaire, il me semble que pour éviter les attaques de type XSS, que chaque fois que quelque chose est placé dans l'élément qu'il devrait d'abord être désinfectés à l'aide d' $désinfecter (c'est à dire ne pas faire confiance à l'HTML). Quelque chose comme element.html($désinfecter(ngModel.$viewValue))`.
InformationsquelleAutor Arun P Johny | 2013-03-07