Skip to content

Commit f3377da

Browse files
committed
feat(ngMessagesInclude): don't break on empty (or whitespace-only) templates
Fixes angular#12941 Closes angular#14726
1 parent 8fcf5f9 commit f3377da

File tree

2 files changed

+42
-14
lines changed

2 files changed

+42
-14
lines changed

src/ngMessages/messages.js

+23-13
Original file line numberDiff line numberDiff line change
@@ -552,22 +552,32 @@ angular.module('ngMessages', [])
552552
$templateRequest(src).then(function(html) {
553553
if ($scope.$$destroyed) return;
554554

555-
$compile(html)($scope, function(contents) {
556-
element.after(contents);
557-
558-
// the anchor is placed for debugging purposes
559-
var comment = $compile.$$createComment ?
560-
$compile.$$createComment('ngMessagesInclude', src) :
561-
$document[0].createComment(' ngMessagesInclude: ' + src + ' ');
562-
var anchor = jqLite(comment);
563-
element.after(anchor);
564-
565-
// we don't want to pollute the DOM anymore by keeping an empty directive element
566-
element.remove();
567-
});
555+
if (isString(html) && !html.trim()) {
556+
// Empty template - nothing to compile
557+
replaceElementWithMarker(element, src);
558+
} else {
559+
// Non-empty template - compile and link
560+
$compile(html)($scope, function(contents) {
561+
element.after(contents);
562+
replaceElementWithMarker(element, src);
563+
});
564+
}
568565
});
569566
}
570567
};
568+
569+
// Helpers
570+
function replaceElementWithMarker(element, src) {
571+
// A comment marker is placed for debugging purposes
572+
var comment = $compile.$$createComment ?
573+
$compile.$$createComment('ngMessagesInclude', src) :
574+
$document[0].createComment(' ngMessagesInclude: ' + src + ' ');
575+
var marker = jqLite(comment);
576+
element.after(marker);
577+
578+
// Don't pollute the DOM anymore by keeping an empty directive element
579+
element.remove();
580+
}
571581
}])
572582

573583
/**

test/ngMessages/messagesSpec.js

+19-1
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,6 @@ describe('ngMessages', function() {
815815
expect(trim(element.text())).toEqual("C");
816816
}));
817817

818-
819818
it('should properly detect a previous message, even if it was registered later',
820819
inject(function($compile, $rootScope, $templateCache) {
821820
$templateCache.put('include.html', '<div ng-message="a">A</div>');
@@ -865,6 +864,25 @@ describe('ngMessages', function() {
865864
$httpBackend.flush();
866865
}).not.toThrow();
867866
}));
867+
868+
it('should not throw if the template is empty',
869+
inject(function($compile, $rootScope, $templateCache) {
870+
var html =
871+
'<div ng-messages="items">' +
872+
'<div ng-messages-include="messages1.html"></div>' +
873+
'<div ng-messages-include="messages2.html"></div>' +
874+
'</div>';
875+
876+
$templateCache.put('messages1.html', '');
877+
$templateCache.put('messages2.html', ' ');
878+
element = $compile(html)($rootScope);
879+
$rootScope.$digest();
880+
881+
expect(element.text()).toBe('');
882+
expect(element.children().length).toBe(0);
883+
expect(element.contents().length).toBe(2);
884+
})
885+
);
868886
});
869887

870888
describe('when multiple', function() {

0 commit comments

Comments
 (0)