aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ng/directive/ngBind.js10
-rw-r--r--test/ng/directive/ngBindSpec.js12
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'); });