aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jqLite.js9
-rw-r--r--src/service/compiler.js7
-rw-r--r--test/jqLiteSpec.js20
-rw-r--r--test/service/compilerSpec.js9
4 files changed, 45 insertions, 0 deletions
diff --git a/src/jqLite.js b/src/jqLite.js
index 48dfcc20..8d9ce09c 100644
--- a/src/jqLite.js
+++ b/src/jqLite.js
@@ -627,6 +627,15 @@ forEach({
}
},
+ wrap: function(element, wrapNode) {
+ wrapNode = jqLite(wrapNode)[0];
+ var parent = element.parentNode;
+ if (parent) {
+ parent.replaceChild(wrapNode, element);
+ }
+ wrapNode.appendChild(element);
+ },
+
remove: function(element) {
JQLiteDealoc(element);
var parent = element.parentNode;
diff --git a/src/service/compiler.js b/src/service/compiler.js
index acfc7851..b73cc690 100644
--- a/src/service/compiler.js
+++ b/src/service/compiler.js
@@ -180,6 +180,13 @@ function $CompileProvider($provide) {
return function(templateElement) {
templateElement = jqLite(templateElement);
+ // We can not compile top level text elements since text nodes can be merged and we will
+ // not be able to attach scope data to them, so we will wrap them in <span>
+ forEach(templateElement, function(node, index){
+ if (node.nodeType == 3 /* text node */) {
+ templateElement[index] = jqLite(node).wrap('<span>').parent()[0];
+ }
+ });
var linkingFn = compileNodes(templateElement, templateElement);
return function(scope, cloneConnectFn){
assertArg(scope, 'scope');
diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js
index 358b8c4a..5b2e35b0 100644
--- a/test/jqLiteSpec.js
+++ b/test/jqLiteSpec.js
@@ -802,6 +802,26 @@ describe('jqLite', function() {
});
});
+
+ describe('wrap', function() {
+ it('should wrap text node', function() {
+ var root = jqLite('<div>A&lt;a&gt;B&lt;/a&gt;C</div>');
+ var text = root.contents();
+ expect(text.wrap("<span>")[0]).toBe(text[0]);
+ expect(root.find('span').text()).toEqual('A<a>B</a>C');
+ });
+ it('should wrap free text node', function() {
+ var root = jqLite('<div>A&lt;a&gt;B&lt;/a&gt;C</div>');
+ var text = root.contents();
+ text.remove();
+ expect(root.text()).toBe('');
+
+ text.wrap("<span>");
+ expect(text.parent().text()).toEqual('A<a>B</a>C');
+ });
+ });
+
+
describe('prepend', function() {
it('should prepend to empty', function() {
var root = jqLite('<div>');
diff --git a/test/service/compilerSpec.js b/test/service/compilerSpec.js
index 8d91ed5d..02cdcefe 100644
--- a/test/service/compilerSpec.js
+++ b/test/service/compilerSpec.js
@@ -96,6 +96,15 @@ describe('$compile', function() {
describe('compile phase', function() {
+ it('should wrap root text nodes in spans', inject(function($compile, $rootScope) {
+ element = jqLite('<div>A&lt;a&gt;B&lt;/a&gt;C</div>');
+ var text = element.contents();
+ expect(text[0].nodeName).toEqual('#text');
+ text = $compile(text)($rootScope);
+ expect(lowercase(text[0].nodeName)).toEqual('span');
+ expect(element.find('span').text()).toEqual('A<a>B</a>C');
+ }));
+
describe('multiple directives per element', function() {
it('should allow multiple directives per element', inject(function($compile, $rootScope, log){
element = $compile(