mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-17 07:40:22 +00:00
Fixed issue where compiler would pass in detached text node if previous markup would have removed it.
This commit is contained in:
parent
d9abfe8a7e
commit
2cb9497d02
4 changed files with 59 additions and 16 deletions
24
regression/jqLite_after_NPE.html
Normal file
24
regression/jqLite_after_NPE.html
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html xmlns:ng="http://angularjs.org">
|
||||
<head>
|
||||
<script type="text/javascript" src="../src/angular-bootstrap.js" ng:autobind></script>
|
||||
<script type="text/javascript">
|
||||
angular.markup('-'+'--', function(text, textNode, parentElement) {
|
||||
var compiler = this;
|
||||
var index = text.indexOf('-'+'--');
|
||||
if (index > -1) {
|
||||
textNode.after(text.substring(index + 3));
|
||||
textNode.after('<hr/>');
|
||||
textNode.after(compiler.text(text.substring(0, index)));
|
||||
textNode.remove();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
{{1+3}}
|
||||
xxx
|
||||
---
|
||||
xxx
|
||||
<select name="something"><option selected="true">{{'a'}}</option><option value="">{{'b'}}</option><option>C</option></select></body>
|
||||
</html>
|
||||
|
|
@ -158,12 +158,17 @@ Compiler.prototype = {
|
|||
}
|
||||
if (descend){
|
||||
// process markup for text nodes only
|
||||
eachTextNode(element, function(textNode){
|
||||
var text = textNode.text();
|
||||
foreach(self.markup, function(markup){
|
||||
markup.call(selfApi, text, textNode, element);
|
||||
});
|
||||
});
|
||||
for(var i=0, child=element[0].childNodes;
|
||||
i<child.length; i++) {
|
||||
if (isTextNode(child[i])) {
|
||||
foreach(self.markup, function(markup){
|
||||
if (i<child.length) {
|
||||
var textNode = jqLite(child[i]);
|
||||
markup.call(selfApi, textNode.text(), textNode, element);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (directives) {
|
||||
|
|
@ -187,15 +192,6 @@ Compiler.prototype = {
|
|||
}
|
||||
};
|
||||
|
||||
function eachTextNode(element, fn){
|
||||
var i, chldNodes = element[0].childNodes || [], chld;
|
||||
for (i = 0; i < chldNodes.length; i++) {
|
||||
if(isTextNode(chld = chldNodes[i])) {
|
||||
fn(jqLite(chld), i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function eachNode(element, fn){
|
||||
var i, chldNodes = element[0].childNodes || [], chld;
|
||||
for (i = 0; i < chldNodes.length; i++) {
|
||||
|
|
|
|||
|
|
@ -52,8 +52,8 @@ angularTextMarkup('{{}}', function(text, textNode, parentElement) {
|
|||
cursor.after(newElement);
|
||||
cursor = newElement;
|
||||
});
|
||||
textNode.remove();
|
||||
}
|
||||
textNode.remove();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -134,4 +134,27 @@ describe('compiler', function(){
|
|||
expect(scope.$element.text()).toEqual('3');
|
||||
});
|
||||
|
||||
it('should allow multiple markups per text element', function(){
|
||||
markup.push(function(text, textNode, parent){
|
||||
var index = text.indexOf('---');
|
||||
if (index > -1) {
|
||||
textNode.after(text.substring(index + 3));
|
||||
textNode.after("<hr/>");
|
||||
textNode.after(text.substring(0, index));
|
||||
textNode.remove();
|
||||
}
|
||||
});
|
||||
markup.push(function(text, textNode, parent){
|
||||
var index = text.indexOf('===');
|
||||
if (index > -1) {
|
||||
textNode.after(text.substring(index + 3));
|
||||
textNode.after("<p>");
|
||||
textNode.after(text.substring(0, index));
|
||||
textNode.remove();
|
||||
}
|
||||
});
|
||||
var scope = compile('A---B---C===D');
|
||||
expect(sortedHtml(scope.$element)).toEqual('<div>A<hr></hr>B<hr></hr>C<p></p>D</div>');
|
||||
});
|
||||
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in a new issue