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