<!doctype html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.js"></script>
<script>
var app = angular.module('myApp', []);
app.directive("taWithMessage",function() {
return {
template: "<p><h2>sample</h2></p>",
replace: true
};
});
</script>
</head>
<body>
<div ng-app="myApp">
<div ta-with-message></div>
</div>
</body>
</html>
.. ran it and BOOM! Got this:
To make it more interesting replacing:
template: "<p><h2>sample</h2></p>",
with
template: "<p><span>sample</span></p>",
or:
template: "<div><h2>sample</h2></div>",
Worked just fine. It obviously didn't have anything to do with display of the element as div s well as p are both block, yet div works fine, p didn't.
Then I started debugging and after a while I realised what a dummy I've been. Given original code, the browser was interpreting it as:
<p></p><h2>sample</h2><p></p>
This excerpt from specs should clarify what the issue was:
A p element's end tag may be omitted if the p element is immediately followed by an address, article, aside, blockquote, div, dl, fieldset, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, main, nav,ol, p, pre, section, table, or ul, element, or if there is no more content in the parent element and the parent element is not an a element.
If you ever read the HTML specs you already know that some elements do not need to have closing end tags. I was well aware of this yet at this point didn't realised that was the issue.
Decided to dig further into AngularJs source itself to see what exactly is going on in there and as it turned out innerHTML is the culprit:
AngularJs nicely passes template code to JQLite (highlighted in yellow below) and JQLite at some point runs it via innerHTML. This spits out modified as per above specs code. Then as shown below, AngularJs checks if the code is valid, so have one root only:
One root meaning:
<div><p>something</p><p>something else</p></div>
Rather than:
<p>something</p><p>something else</p>
As the code JQLite spits out is:
<p></p><h2>sample</h2><p></p>
It fails the check and Angular throws Error.
All this Googling and head scratching could be avoided if I only remembered the basic specs. Shame on me.. =/
thanks for sharing this information
ReplyDeleteQlik Sense Training in Bangalore
Machine Learning training in bangalore
data science with python training in Bangalore
Artificial Intelligence training in Bangalore
python training in jayanagar bangalore
best python training institute in bangalore
python training in bangalore