feat(ngMessagesInclude): don't break on empty (or whitespace-only) templates
Fixes #12941 Closes #14726
This commit is contained in:
+23
-13
@@ -552,22 +552,32 @@ angular.module('ngMessages', [])
|
||||
$templateRequest(src).then(function(html) {
|
||||
if ($scope.$$destroyed) return;
|
||||
|
||||
$compile(html)($scope, function(contents) {
|
||||
element.after(contents);
|
||||
|
||||
// the anchor is placed for debugging purposes
|
||||
var comment = $compile.$$createComment ?
|
||||
$compile.$$createComment('ngMessagesInclude', src) :
|
||||
$document[0].createComment(' ngMessagesInclude: ' + src + ' ');
|
||||
var anchor = jqLite(comment);
|
||||
element.after(anchor);
|
||||
|
||||
// we don't want to pollute the DOM anymore by keeping an empty directive element
|
||||
element.remove();
|
||||
});
|
||||
if (isString(html) && !html.trim()) {
|
||||
// Empty template - nothing to compile
|
||||
replaceElementWithMarker(element, src);
|
||||
} else {
|
||||
// Non-empty template - compile and link
|
||||
$compile(html)($scope, function(contents) {
|
||||
element.after(contents);
|
||||
replaceElementWithMarker(element, src);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Helpers
|
||||
function replaceElementWithMarker(element, src) {
|
||||
// A comment marker is placed for debugging purposes
|
||||
var comment = $compile.$$createComment ?
|
||||
$compile.$$createComment('ngMessagesInclude', src) :
|
||||
$document[0].createComment(' ngMessagesInclude: ' + src + ' ');
|
||||
var marker = jqLite(comment);
|
||||
element.after(marker);
|
||||
|
||||
// Don't pollute the DOM anymore by keeping an empty directive element
|
||||
element.remove();
|
||||
}
|
||||
}])
|
||||
|
||||
/**
|
||||
|
||||
@@ -815,7 +815,6 @@ describe('ngMessages', function() {
|
||||
expect(trim(element.text())).toEqual("C");
|
||||
}));
|
||||
|
||||
|
||||
it('should properly detect a previous message, even if it was registered later',
|
||||
inject(function($compile, $rootScope, $templateCache) {
|
||||
$templateCache.put('include.html', '<div ng-message="a">A</div>');
|
||||
@@ -865,6 +864,25 @@ describe('ngMessages', function() {
|
||||
$httpBackend.flush();
|
||||
}).not.toThrow();
|
||||
}));
|
||||
|
||||
it('should not throw if the template is empty',
|
||||
inject(function($compile, $rootScope, $templateCache) {
|
||||
var html =
|
||||
'<div ng-messages="items">' +
|
||||
'<div ng-messages-include="messages1.html"></div>' +
|
||||
'<div ng-messages-include="messages2.html"></div>' +
|
||||
'</div>';
|
||||
|
||||
$templateCache.put('messages1.html', '');
|
||||
$templateCache.put('messages2.html', ' ');
|
||||
element = $compile(html)($rootScope);
|
||||
$rootScope.$digest();
|
||||
|
||||
expect(element.text()).toBe('');
|
||||
expect(element.children().length).toBe(0);
|
||||
expect(element.contents().length).toBe(2);
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
describe('when multiple', function() {
|
||||
|
||||
Reference in New Issue
Block a user