diff options
| -rw-r--r-- | src/ng/directive/ngBind.js | 10 | ||||
| -rw-r--r-- | test/ng/directive/ngBindSpec.js | 12 | 
2 files changed, 19 insertions, 3 deletions
| diff --git a/src/ng/directive/ngBind.js b/src/ng/directive/ngBind.js index de374574..64a2d821 100644 --- a/src/ng/directive/ngBind.js +++ b/src/ng/directive/ngBind.js @@ -134,11 +134,15 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {   * @element ANY   * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.   */ -var ngBindHtmlDirective = ['$sce', function($sce) { +var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {    return function(scope, element, attr) {      element.addClass('ng-binding').data('$binding', attr.ngBindHtml); -    scope.$watch(attr.ngBindHtml, function ngBindHtmlWatchAction(value) { -      element.html($sce.getTrustedHtml(value) || ''); + +    var parsed = $parse(attr.ngBindHtml); +    function getStringValue() { return (parsed(scope) || '').toString(); } + +    scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) { +      element.html($sce.getTrustedHtml(parsed(scope)) || '');      });    };  }]; diff --git a/test/ng/directive/ngBindSpec.js b/test/ng/directive/ngBindSpec.js index be68464f..7af4c13f 100644 --- a/test/ng/directive/ngBindSpec.js +++ b/test/ng/directive/ngBindSpec.js @@ -102,6 +102,18 @@ describe('ngBind*', function() {          expect(angular.lowercase(element.html())).toEqual('<div onclick="">hello</div>');        })); +      it('should watch the string value to avoid infinite recursion', inject(function($rootScope, $compile, $sce) { +        // Ref: https://github.com/angular/angular.js/issues/3932 +        // If the binding is a function that creates a new value on every call via trustAs, we'll +        // trigger an infinite digest if we don't take care of it. +        element = $compile('<div ng-bind-html="getHtml()"></div>')($rootScope); +        $rootScope.getHtml = function() { +          return $sce.trustAsHtml('<div onclick="">hello</div>'); +        }; +        $rootScope.$digest(); +        expect(angular.lowercase(element.html())).toEqual('<div onclick="">hello</div>'); +      })); +        describe('when $sanitize is available', function() {          beforeEach(function() { module('ngSanitize'); }); | 
