如何从浏览器控制台访问组件控制器?

问题描述:

在角度1.x中,当使用ng-controller时,可以通过检查元素并调用angular.element($0).controller()从浏览器控制台访问控制器实例。如何从浏览器控制台访问组件控制器?

这并不与组件的工作原理声明:

angular.module('foo').component('bar', { 
    controller: class { 

    } 
}); 

是否有任何其他的方式来从控制台访问组件的控制器实例?

我们似乎得到访问组件控制器最接近的是:

angular.element($0).scope().$ctrl

+0

对于*组件控制器*这不起作用,因为它使用隔离范围。此外,如果组件具有非默认的控制器标识符,则这不起作用。 – estus

+1

@estus这完全符合我的预期。它允许我为DOM中的任何元素找到控制器。是的,它不适用于自定义标识符。但是很简单,就像.controller()一样。 – Natan

+0

这是我的观点。它不适用于任何元素。因为具有继承范围的元素将范围作为'.scope()'暴露。并且组件元素本身将它公开为'.isolateScope()'。 – estus

作为the manual states

控制器(名称) - 检索当前元素或 其父的控制器。默认情况下,检索与ngController指令相关的控制器。如果名称是作为camelCase指令 名称提供的,则将检索此指令的控制器(例如, 'ngModel')。

它是angular.element($0).controller('bar')

对于分量这可以缩小到

angular.element($0).controller(
    $0.tagName.toLowerCase().replace(/-([a-z])/g, (_, c) => c.toUpperCase())) 
); 

单行。

+0

这实际上并没有做同样的事情,因为它需要你已经知道你在找什么。如果您不知道指令的名称,则需要先查看是否违反了目的。 – Natan

+0

它做它做的。 'controller()'为默认指令(ngController)获取一个控制器。 'controller(...)'获得其他指令的控制器。每个元素和多个控制器可能有多个指令,因此得到一个任意指令是没有意义的。您可以在DOM中检查所需指令的名称。 – estus

+0

你可以用'angular.element($ 0).data()'获得每个元素的控制器列表(和其他内部东西)。 – estus