diff options
| author | Misko Hevery | 2012-02-03 16:20:24 -0800 | 
|---|---|---|
| committer | Misko Hevery | 2012-02-21 22:46:00 -0800 | 
| commit | 4a051efb89cf33e30d56f1227d1f6084ead4cd42 (patch) | |
| tree | fd65bc139f121ebc124f83dc63c0ceab4d28e5f2 | |
| parent | 1752c8c44a7058e974ef208e583683eac8817789 (diff) | |
| download | angular.js-4a051efb89cf33e30d56f1227d1f6084ead4cd42.tar.bz2 | |
feat($compile): support compiling text nodes by wrapping them in <span>
| -rw-r--r-- | src/jqLite.js | 9 | ||||
| -rw-r--r-- | src/service/compiler.js | 7 | ||||
| -rw-r--r-- | test/jqLiteSpec.js | 20 | ||||
| -rw-r--r-- | test/service/compilerSpec.js | 9 | 
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<a>B</a>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<a>B</a>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<a>B</a>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(  | 
