【问题标题】:how to access Angular2 component specific data in console?如何在控制台中访问 Angular2 组件的特定数据?
【发布时间】:2016-05-15 23:40:25
【问题描述】:

有没有办法在控制台中访问 Angular2 特定组件的特定数据,以进行调试?

就像 Angular1 有能力在控制台中访问它的组件值。

【问题讨论】:

  • 这可能不是您想要的,但我仍然发现有时只使用console.log(JSON.stringify(this)) 很有用。
  • 谢谢@Mark,会检查一下..你想把那个控制台放在我的控制台中的组件类中吗?不要误会我的意思,只是问问。
  • 把它放在任何能提供你需要的可见性的方法中:在组件的构造函数中、在 ngOnInit() 中、在 ngOnChanges() 中、在事件处理程序中,等等。
  • 我知道我可以通过 console.log(this) 获取组件上下文。但是如何从浏览器控制台访问组件上下文。虽然我会尝试你的建议。谢谢;)

标签: debugging console angular


【解决方案1】:

更新 4.0.0

StackBlitz example

更新 RC.1

Plunker example 在左上角的浏览器控制台(过滤器符号)中选择plunkerPreviewTarget(或在其自己的窗口中启动演示应用程序)然后输入示例

在DOM节点中选择一个组件,在控制台中执行

ng.probe($0);

或者对于 IE - 感谢 Kris Hollenbeck(参见 cmets)

ng.probe(document.getElementById('myComponentId')).componentInstance

替代方案

提示:启用调试工具会覆盖 ng.probe()

启用调试工具,例如:

import {enableDebugTools} from '@angular/platform-browser';

bootstrap(App, []).then(appRef => enableDebugTools(appRef))

使用上面的 Plunker 示例并在控制台中执行示例:

  • ng.profiler.appRef
  • ng.profiler.appRef._rootComponents[0].instance
  • ng.profiler.appRef._rootComponents[0].hostView.internalView
  • ng.profiler.appRef._rootComponents[0].hostView.internalView.viewChildren[0].viewChildren

我还没有找到调查Bar 指令的方法。

基于此 API 的 Augury 提供了更好的调试体验

原始(测试版)

这里总结了如何做到这一点https://github.com/angular/angular/blob/master/TOOLS_JS.md死链接,我还没有找到替代品)。

启用调试工具

默认情况下,调试工具被禁用。您可以按如下方式启用调试工具:

import {enableDebugTools} from 'angular2/platform/browser';

bootstrap(Application).then((appRef) => {
  enableDebugTools(appRef);
});

使用调试工具

在浏览器中打开开发者控制台(在 Chrome 中为 Ctrl + Shift + j)。顶级对象称为 ng,其中包含更具体的工具。

例子:

ng.profiler.timeChangeDetection();

另见

【讨论】:

【解决方案2】:

首先使用 chrome 'inspect element' 选择元素,然后在 chrome 'developer console' 中运行以下方法。

ng.probe($0).componentInstance

您也可以使用如下所示的 css 选择器。

ng.probe($$('.image-picker')[0]).componentInstance

如果您经常这样做,为了让它更容易一些,请创建一个全局快捷方式,如下所示。现在使用“检查元素”选择组件内的任何 DOM 元素并从控制台调用“e()”

window['e'] = () => eval('ng.probe($0).componentInstance');

【讨论】:

  • 从今天起可与 5.2.0 一起使用。不过,过去可能并非如此。
  • 这在生产中有效吗?我正在尝试在生产中的 angular v7.2.7 应用程序上执行 ng.prove($0),它只返回 null
  • @doublea 这在生产中不起作用。对于生产模式,这个答案可能有用:stackoverflow.com/a/68113807/23715
  • 在 Angular 9+ 中,使用 ng.getComponent($0); (stackoverflow.com/a/60539678/11991371)
【解决方案3】:

使用全局范围变量。(任何浏览器)

在组件文件的ngOnInit()

ngOnInit() {
   window['test'] = this;
   
}

现在我们可以访问该组件的实例,包括服务(在该组件上导入)。

如果您想阻止访问 test 以进行生产,您可以有条件地授予对 test 的访问权限,例如:

constructor(private _configService: ConfigService) {
}
ngOnInit() {
   if(_configService.prod) {
      window['test'] = this;
   }
   
}

这里_configService表示所有组件和服务使用的服务实例。
所以变量将被设置为:

export class ConfigService {
   prod = false;
}

【讨论】:

  • 我喜欢这个是使用最简单的方法......可惜我们必须 TS,它会更简单
  • 这个解决方案的问题是你必须重新编译代码。对进程中的调试不是很好。此外,一个组件在页面上可以有多个实例。
【解决方案4】:

我很惊讶这里没有人提到 Augury,它是一个 Chrome 插件,可让您方便地访问组件中的所有信息,还可以更轻松地直接在控制台中查看这些信息:

https://augury.rangle.io/

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 2021-07-15
    • 2017-11-29
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多