I understand I can get the scope by element:
scope = angular.element($0).scope();
scope.$id; // "003"
How do I get reverse: Find the DOM element using the scope $id
, such as 003
?
I'd like to do this for debugging purposes. My scope tree shows something and I'd like to identify where it came from.
Although it's not very sexy each dom node gets a class ng-scope so you could tech do something like this maybe:
function getScope(id) {
var elem;
$('.ng-scope').each(function(){
var s = angular.element(this).scope(),
sid = s.$id;
if(sid == id) {
elem = this;
return false; // stop looking at the rest
}
});
return elem;
}
Trying out the answer, I found that directives don't seem to have the class ng-scope
, so here's a modified version that'll fallback to everything.
var getByScopeId = function(id) {
var filterfn = function(i,el) {
var sc = angular.element(el).scope();
return sc && sc.$id == id;
};
// low hanging fruit -- actual scope containers
var result = $('.ng-scope').filter(filterfn);
if(result && result.length) return result;
// try again on everything...ugh
return $(':not(.ng-scope)').filter(filterfn);
}
Usage:
var results = getByScopeId('003')
The same solution written in es2015, without JQuery dependency:
getElementFromScopeId = (id) => [].slice.call(document.querySelectorAll('.ng-scope')).map((x) => angular.element(x)).filter(x => x.scope().$id == id).pop();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With